我有个问题。我的程序在sam etime包含10个TCP服务器。一旦注意到来自客户端的请求,相应的tcp服务器套接字将接受连接并在单独的线程中处理它。我知道这不是解决我实际问题的最有效的方法,但是好吧。。
在main中,我有一个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()failed:文件描述符错误????
当我在pthread_create和pthread_detach之间添加sleep(1)时,一切正常!
有人能给我解释一下这种情况吗?或者帮我解决问题?
谢谢!
最佳答案
好吧,即使accept
失败,你也要尝试接收。这使我相信,在尝试接受被动Socket
文件描述符之前,您没有正确设置它。
如果在主线程中设置Socket
描述符,那么可能是新线程在执行此操作之前启动并运行。
关于c++ - recv()失败:错误的文件描述符c++ Linux,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18758307/