1

sendto我写了一个可以使用and发送和接收数据包的 c++ windows 进程(如果重要的话是 Win7)recvfrom,但不幸的是,并不是所有的数据包都是从套接字读取的。两台计算机都直接连接并双向传输 2000 个数据包(每秒 1 个数据包,每个 500 位),当我打开 WireShark 时,我可以看到 2000 个数据包到达了目的地,但由于某种原因,我的进程从套接字读取的数据更少超过 2000 个(约 1980 个数据包)。recvfrom只要进程处于活动状态,该函数就在运行的任务中。数据包到达目的地但我的进程没有收到它的原因可能是什么?我的代码是否存在问题或 recvfrom 存在已知问题,或者可能是因为它是 udp?没有涉及错误,这是代码的一部分:

更新:问题出在套接字配置上。当我打开它时,我使用了 1 秒的 setsockopt SO_RCVTIMO,将 1 更改为 100000 微秒,它解决了问题。

    socklen_t sockaddr_in_len = sizeof(sockaddr_in);  
    nResult = recvfrom(s,
                              buff,
                              buffLen,
                              0,
                              (sockaddr*)sender,
                              &sockaddr_in_len);  
        SAFE_UINT ulError = WSAGetLastError();



        if (nResult == -1)  


{  
    if(ulError != WSAETIMEDOUT)  
        {   
            Sleep(100);  
            switch (ulError)  
            {  
                case WSAECONNRESET:  
                    //Print error     
                    return S_OK;  
                case WSAEINTR:  
                    //Print error  
                    return S_OK;  
                case WSAENOTSOCK:  
    //Print error  
                    return S_OK;   
                case WSAENOTCONN:  
                    //Print error  
                    return S_OK;   
                default:  
                    //Print error  
                    return S_OK;   
            }  
        }  
        else  
        {  
            //Print error  
            return S_OK;   
        }  
    }  
    else if (nResult == 0)  
    {  
        //Print error  
        return S_OK;  
    }  
4

0 回答 0