我有个问题。 我的程序在同一时间包括10个TCP服务器。 一旦发现来自客户端的请求,相应的tcp服务器套接字将接受连接,并在一个单独的线程中处理它。 我知道这不是解决我的实际问题的最有效的方法,但没关系。
在主要我有一个for循环,将调用一个名为Peer的对象中的一个函数是StartThread()
for (it= ListOfPeers.begin();it!= ListOfPeers.end();it++) { (*it).second->StartThread(); }
因为有一些条件,这个循环将被使用,但我想尽可能多地缩小代码的范围。
函数StartThread将在每个对象中被调用:
void StartThread() { pthread_t threadDoEvent; pthread_create( &threadDoEvent, NULL, &DoEvent_helper,this); pthread_detach(threadDoEvent); } void *DoEvent_helper( void *ptr ) // Helper to implement thread { return ((Peer *)ptr)->DoEvent(); }
DoEvent是处理请求和连接的函数:
void* DoEvent() { unsigned char buffer[1024]; int rc; int close_conn= FALSE; int new_sd; new_sd = accept(Socket, NULL, NULL); if (new_sd < 0) { if (errno != EWOULDBLOCK) { perror(" accept() failed"); close_conn = TRUE; } } do { rc = recv(new_sd, buffer, sizeof(buffer), 0); if (rc < 0) { if (errno != EWOULDBLOCK) { perror(" recv() failed"); close_conn = TRUE; } break; } if (rc == 0) { printf(" Connection closed\n"); close_conn = TRUE; break; } [DO SOMETHING WITH THE BUFFER] rc = send(new_sd, buffer, len, 0); if (rc <= 0) { perror(" send() failed"); close_conn = TRUE; break; } }while (close_conn==FALSE); close(new_sd); }
我的问题是为什么我收到错误:recv()失败:错误的文件描述符? 当我在pthread_create和pthread_detach之间添加睡眠(1)时,一切正常! 有人可以向我解释这种情况吗? 或者可能帮助我解决我的问题?
谢谢!
那么,即使accept
失败,你也试图accept
。 这使我相信,在尝试接受它之前,您没有正确地设置被动Socket
文件描述符。
如果您在主线程中设置了Socket
描述符,那么可能是在执行之前,新线程将启动并运行。
确保new_sd在持久内存中。 例如,如果它是由启动线程并退出的函数分配的,则new_sd将指向垃圾。 (至少我是这样的)