如何诊断“随机” Winsock故障

时间:2019-10-17 23:54:52

标签: windows tcp winsock2

我有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;

}

0 个答案:

没有答案