我有winsock2应用程序,两端都运行Windows。 MSVC ++ 2017是我的开发环境。不必过多地关注细节,它的两端(都是我写的)来回发送小消息。两端都作为Windows服务运行,并且该连接可以保持运行数小时或数天。问题在于,在它的一端(称为机器A),正常运行一个小时或更长时间后,连接似乎失败。机器A向机器B发送一条消息,该消息被接收,然后机器B发回响应。机器A的套接字处于非阻塞模式,因此它进入了调用recv()的循环,直到显示数据为止。如果获取WSAEWOULDBLOCK,它将检查是否已发生超时间隔,如果没有发生,则循环返回Recv()。发生错误是因为超过了超时值(3分钟)。不可能将数据延迟这么长时间,因为已经发生了一些事情。机器A的后续send()导致错误10054,连接重置。
正如我所说,这可以持续几个小时而不会出现问题。其他时候,我看到它在45分钟左右后就失败了。两台计算机均配置为不进入省电模式或类似模式。有人可以建议我如何诊断该问题吗?
更新:示例代码。目的是要等到接收到一定长度(tlen)的缓冲区,并在出现问题时允许例程超时:
while (TRUE) {
Sleep(1);
iret = recv(isocket, s, rlen, 0);
err = WSAGetLastError();
if (iret == SOCKET_ERROR) {
if (err == WSAEWOULDBLOCK) {
time(&tcur);
if (tcur > tend) {
com_Log("Timeout on recv 1");
return(FALSE);
}
continue;
}
com_Log("Error on recv, error=%lu", err);
return(FALSE);
}
time(&tend);
tend = tend + gTimeOut;
clen = clen + iret;
if (clen >= tlen) break;
s = s + iret;
rlen = rlen - iret;
}