recv funktion中的蓝牙线程'坏文件描述符'

时间:2015-01-07 16:23:44

标签: linux multithreading sockets bluetooth pthreads

我正在使用linux套接字编写服务器/客户端程序。我希望服务器和客户端可以同时使用线程进行读写。 (我所遵循的完整代码可以在http://www.praxisbuch.net/embedded-linux/downloads.html)下载。

当我启动()我的线程时,它会抛出一个“Bad file descriptor”的无限循环。

我的client.cpp如下:

class receiveThread : public Thread {
public:
    receiveThread(RawMessage& rawMsg) : data_control(rawMsg) {}

virtual void run() {

    cout << "starting recveive thread ..." << endl;
    while(1) {

        int recvBytes = bt_socket.recieveMessage(&temp_data_control);
        try {
            cout << "Received new Target Position: " << temp_data_control.data.value1 << endl;
            data_control = temp_data_control;
        }
        catch (SocketException) {
            cout << "Received exception " << endl;
            sleep(1);
        }
    }
}

~receiveThread() {
    bt_socket.disconnect();
}

private:
    BtSocket bt_socket;
    RawMessage temp_data_control;
    RawMessage& data_control;
};


int main() {
    BtSocket BtClient(PORTNUM);

     // connect to the server.
     BtClient.connectToServer();

     RawMessage raw_mes;

     receiveThread recv_thread(raw_mes);
     recv_thread.start(); //the error occurs

     while (1)
     {
         //do something
     }

     return 0;
}

thread.cpp如下:

void Thread::start() throw(Thread::Exception) {
    if (pthread_create(&thread_id, 0, thread_starter, (void *) this) != 0) {
        throw Exception("Thread::start: Cannot create thread");
    }
}

void* Thread::thread_starter(void* thread_obj) {
    Thread* self = reinterpret_cast<Thread*> (thread_obj);
    self->setRunning(true);
    self->run();
    self->setRunning(false);
    return 0;
 }

在socket.cpp中抛出异常:

int BtSocket::recieveMessage(AbstractDatagram *abstractDgm)
{
    int numBytes;

    if ((numBytes = recv(s, abstractDgm->getData(), abstractDgm->getSize(), 0)) < 0)
    {
        cout << strerror(errno) << endl;
    }

    return numBytes;
}

我真的不知道问题是什么。 任何帮助都将非常感谢!

编辑:(也来自socket.cpp)

Socket::Socket(int pNumber)
{
    portNumber = pNumber;
    blocking = 1;

    if ((s = socket(AF_BLUETOOTH, SOCK_STREAM, BTPROTO_RFCOMM)) == -1)
        {
            throw SocketException("socket failed (socket())", true);
        }

    locAddr.rc_family = AF_BLUETOOTH;
    str2ba(dest, &locAddr.rc_bdaddr);
    locAddr.rc_channel = portNumber;
}

void BtSocket::connectToServer()
{

struct sockaddr_rc serverAddr;

serverAddr.rc_family = AF_BLUETOOTH;
serverAddr.rc_channel = 1;
str2ba(dest, &serverAddr.rc_bdaddr);

if (connect(s, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) == -1)
    {
        throw SocketException("Connect failed (connect())", true);
    }
}

我想我正确地打开了套接字!? 它能以某种方式关闭吗?

0 个答案:

没有答案