recv() 失败:错误的文件描述符 c++ Linux

recv() failed: Bad file descriptor c++ Linux

本文关键字:描述 文件 c++ Linux 错误 失败 recv      更新时间:2023-10-16

>我有一个问题。我的程序包括 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将指向垃圾。(至少对我来说是这样)