Linux 蓝牙线程';错误的文件描述符';在录制功能中

Linux 蓝牙线程';错误的文件描述符';在录制功能中,linux,multithreading,sockets,bluetooth,pthreads,Linux,Multithreading,Sockets,Bluetooth,Pthreads,我正在使用linux套接字编写一个服务器/客户端程序。我希望服务器和客户端都可以使用线程同时读写。 (我遵循的完整代码可以在下载) 当我启动()我的线程时,它抛出一个无限循环“坏文件描述符” 我的client.cpp如下: class receiveThread : public Thread { public: receiveThread(RawMessage& rawMsg) : data_control(rawMsg) {} virtual void run() {

我正在使用linux套接字编写一个服务器/客户端程序。我希望服务器和客户端都可以使用线程同时读写。 (我遵循的完整代码可以在下载)

当我启动()我的线程时,它抛出一个无限循环“坏文件描述符”

我的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;
}
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;
 }
我想我正确地打开了插座!?
它可能是以某种方式关闭的吗?

您必须关闭在
recv(s,abstractDgm->getData(),abstractDgm->getSize(),0))
中使用的名为
s
的文件描述符。或者你甚至没有打开它,不知道没有更多的信息。我添加了套接字和文件描述符代码。
int BtSocket::recieveMessage(AbstractDatagram *abstractDgm)
{
    int numBytes;

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

    return numBytes;
}
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);
    }
}