我编写了一个c ++窗口进程(Win7,如果它很重要)可以使用sendto
和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;
}