Я написал процесс 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;
}
Задача ещё не решена.
Других решений пока нет …