Linux 蓝牙线程';错误的文件描述符';在录制功能中
我正在使用linux套接字编写一个服务器/客户端程序。我希望服务器和客户端都可以使用线程同时读写。 (我遵循的完整代码可以在下载) 当我启动()我的线程时,它抛出一个无限循环“坏文件描述符” 我的client.cpp如下: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() {
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);
}
}