Recvfrom windows功能不接收来自OS的所有数据包

时间:2018-01-18 14:08:12

标签: c++ sockets udp winsock recvfrom

我编写了一个c ++窗口进程(Win7,如果它很重要)可以使用sendtorecvfrom发送和接收数据包,但遗憾的是并非所有数据包都是从套接字读取的。两台计算机都直接连接并传输双向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;  
    }  

0 个答案:

没有答案