select()在send()之后不会超时

select() wont timeout after send()

本文关键字:超时 send select 之后      更新时间:2023-10-16

我开始锁定套接字编程,遇到了一点小麻烦:我在下面创建了一个小程序,它通过udp发送消息,如果可能的话,在循环中接收消息。稍后我想尝试使用多个套接字,所以我使用select()

当我使用我的127.0.0.1时,select()在第一个循环中(在send()之后(给出超时,但之后它总是返回1,指示套接字是可读的,而不接收消息:

//C++
WSADATA wsa;
SOCKADDR_IN RemoteAddr;
SOCKADDR_IN OwnAddr;
SOCKET UDP_Socket1;
fd_set m_Fds;
struct timeval m_Timeout;
int iRemoteAddrLenght = sizeof(SOCKADDR_IN);
int i = 0;
//--Init
WSAStartup (MAKEWORD (2,2), &wsa);
UDP_Socket1 = socket(AF_INET, SOCK_DGRAM, 0);
m_Timeout.tv_sec = 2;
m_Timeout.tv_usec = 0;
RemoteAddr.sin_family = AF_INET;
RemoteAddr.sin_port = htons (2002);
RemoteAddr.sin_addr.s_addr = inet_addr("127.0.0.1");   
OwnAddr.sin_family = AF_INET;
OwnAddr.sin_port = htons (2003);
OwnAddr.sin_addr.s_addr = htonl(INADDR_ANY);
bind(UDP_Socket1, (SOCKADDR*) &OwnAddr, sizeof(OwnAddr));
for(;;)
{
    //..//
    //--send
    sendto(UDP_Socket1, sSend.c_str(), strlen(sSend.c_str()), 0 ,  (SOCKADDR*)&RemoteAddr, sizeof(RemoteAddr));
    //--select & recv
    FD_ZERO(&m_Fds);
    FD_SET(UDP_Socket1,&m_Fds);
    i = select(sizeof(m_Fds)*8, &m_Fds, NULL, NULL, &m_Timeout);
    if(i > 0)
    {
        recvfrom(UDP_Socket1, m_szBuff, 256, 0, (SOCKADDR*) &RemoteAddr, &m_iRemoteAddrLenght);
    } //if
    else if(i < 1)        // "0" in 1st loop, then "1" =(
    {
        cout << "Udp Timeout" << endl;    
    } //else if
} //for

send返回56(字节发送(带WSAGetLastError: 0

recvfrom返回-1WSAGetLastError: 10054

我很感谢您的帮助,为什么select()在应该超时时返回1

您可以忽略UDP的这类错误。有些操作系统会报告它们,有些则不会。它们基本上毫无意义。