recv() 失败:错误的文件描述符 c++ Linux
recv() failed: Bad file descriptor c++ Linux
>我有一个问题。我的程序包括 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 closedn");
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
你也会尝试接收。这让我相信,在尝试接受被动Socket
文件描述符之前,您没有正确设置它。
如果在主线程中设置了Socket
描述符,则可能是新线程在您执行此操作之前启动并运行。
确保new_sd在持久内存中。 例如,如果它是由启动线程并退出的函数分配的,那么new_sd将指向垃圾。(至少对我来说是这样)
相关文章:
- 使用VerQueryValue检索应用程序的文件描述
- 如何在C/C++中用FD_set Unix设置套接字文件描述符
- I2C 文件描述符上的 I2C 总线可写/可读标志
- 许多文件描述符在调用sys_clone时
- AMQP-CPP >处理程序中的错误文件描述符
- 如何使用 WINAPI 和 C++ 提取可执行文件的文件描述?
- 正在等待在非阻塞文件描述符上长时间运行ioctl
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 如何强制文件描述符缓冲我的输出
- 如何从 boost::asio::ssl::stream<boost::asio::ip::tcp::socket> 获取本机套接字文件描述器?
- 哪个更适合从C++写入敏感的日志文件,在文件描述符上写()或文件上的fprintf()?
- 将 select() 与非基于文件描述符的输入一起使用
- accept(..) 似乎正在修改我给它的文件描述符参数
- 使用 Select 多路复用未命名的管道和其他文件描述符
- 提升 ASIO 绑定:错误的文件描述符
- 使用文件描述符移动对象
- 无法从零MQ ZMQ_SERVER套接字中获取文件描述符
- read() 上的不同行为取决于写入不可写内存时表示文件、匿名管道或套接字的文件描述符
- 我是否需要在使用它的 R 包的描述文件中导入 RccpEigen,或者"LinkingTo"足够?
- GCC链接器描述文件强制符号位于特定地址