c++ - Select() 有时不等待

标签 c++ sockets udp chat chatroom

我正在写一个聊天程序,我的接收函数有时根本不等待。接收代码如下: 重要的部分基本上是前半部分,但为了以防万一,我添加了整个函数。 (编辑:评论是我自己的,不是给你们阅读的笔记!抱歉!)

ReceiveStatus Server::Receive(PacketInternal*& packetInternalOut)
{
    fd_set fds ;
    int n ;
    struct timeval tv ;

    // Set up the file descriptor set.
    FD_ZERO(&fds) ;
    FD_SET(*p_socket, &fds) ;

    // Set up the struct timeval for the timeout.
    tv.tv_sec = NETWORKTIMEOUTSEC ;
    tv.tv_usec = NETWORKTIMEOUTUSEC ;

    // Wait until timeout or data received.
    n = select ( *p_socket, &fds, NULL, NULL, &tv ) ;
    if ( n == 0)
    { 
        return ReceiveStatus::ReceiveTimeout;
    }
    else if( n == -1 )
    {
        return ReceiveStatus::ReceiveSocketError;   
    }

    //need to make this more flexible so it can support others
    sockaddr_in fromAddr;
    int flags = 0;
    int fromLength = sizeof(fromAddr);

    char dataIn[TOTALPACKETSIZE];
    int bytesIn = recvfrom(*p_socket, dataIn, TOTALPACKETSIZE, flags, (SOCKADDR*)&fromAddr, &fromLength);
    // Convert fromAddr into ip, port
    if(bytesIn == SOCKET_ERROR)
    {
        return ReceiveStatus::ReceiveSocketError;
    }
    if(bytesIn > 0)
    {
        memcpy(packetInternalOut,dataIn,bytesIn);
        return ReceiveStatus::ReceiveSuccessful;
    }
    else
    {
        return ReceiveStatus::ReceiveEmpty;
    }

}

是否有任何因素会影响此功能是否有效?我的聊天程序可以是服务器也可以是客户端。他们都使用相同的代码。服务器在等待连接时,在 Select() 上等待 100 秒,因为 NETWORKTIMEOUTSEC = 100。但是在 char 程序中,每当我想发送消息时,我首先发送一个传输请求,然后等待一个acknowledgement(对于确认包,我需要再次调用接收)。现在这是不等待的步骤。我的 ReceiveAck 函数调用 Receive(),并且 receive 直接运行整个代码。我可以通过创建一个客户端而不是服务器来测试它。如果我在没有服务器的地方发送一条消息,它应该等待 100 秒以获得确认,然后超时。但是,我一按回车,它就说超时了。

我不知道是什么让它跳过这一步。我已经在服务器和客户端状态下调试了我的聊天程序。 tv 和 fds 的值在两者中是相同的,但是服务器将等待而客户端不会...

最佳答案

select() 的第一个参数比最后一个套接字一个。所以你需要:

n = select ( *p_socket + 1, &fds, NULL, NULL, &tv ) ;

关于c++ - Select() 有时不等待,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9596014/

相关文章:

c++ - WinAPI 工具栏按钮的 "Selected"样式?

c - 通过 BSD 套接字获取我计算机在本地网络上的 IP 地址?

Java Socket 类转换异常

linux - 设置不同的发送和接收内核缓冲区大小

c++ - std::string 得到一个完全出乎意料的值

c++ - 成员函数 'select' 的“this”参数具有类型 'const SelectParam' ,但函数未标记为 const

c++ - 这个 C++ 片段的语法是什么?

Python套接字ssl连接

node.js - Nodejs + Express : make http request wait for udp response