Функция Recvfrom Windows не получает все пакеты от ОС

Я написал процесс Windows C++ (Win7, если это имеет значение), который может отправлять и получать пакеты, используя sendto а также recvfrom, но, к сожалению, не все пакеты читаются из сокета. Оба компьютера напрямую подключены и передают двунаправленные 2000 пакетов (1 пакет в секунду, 500 бит каждый), когда я открываю WireShark, я вижу, что 2000 пакетов попали в пункт назначения, но по какой-то причине мой процесс читает из сокета меньше чем 2000 (~1980 пакетов). recvfrom Функция находится в задаче, которая выполняется до тех пор, пока процесс активен. В чем может быть причина того, что пакет попадает в пункт назначения, но мой процесс его не получил? Есть проблема с моим кодом или известная проблема с recvfrom или, может быть, это потому, что это UDP? Там нет ошибок, это часть кода:

Обновление: проблема была с конфигурацией сокета. Когда я открыл его, я использовал setsockopt SO_RCVTIMO, равный 1 секунде, изменил 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 ответов

Другие вопросы по тегам