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;
}