偶发TCP连接失败(WSAEHOSTUNREACH)

在本地千兆网络上,我有一个使用单个TCP服务器和许多客户端的应用程序。 每个客户端每30秒ping一次服务器,打开TCP连接,发送状态消息,然后关闭。

使用SocketAsyncEventArgs设置服务器的方式与此处显示的示例非常相似(为简洁起见,省略)

客户端使用TcpClient启动连接。

客户代码的相关部分:

 using (TcpClient client = new TcpClient()) { IAsyncResult ar = client.BeginConnect(address, port, null, null); if (!ar.AsyncWaitHandle.WaitOne(timeout)) { throw new ApplicationException("Timed out waiting for connection to " + address); } client.EndConnect(ar); //exception thrown 5%-10% of the time //...send message and receive response... } 

一切正常,除了在某些机器上,在EndConnect只有5%-10%的时间抛出exception。

例外是WSAEHOSTUNREACH (10065):

 System.Net.Sockets.SocketException (0x80004005): A socket operation was attempted to an unreachable host 192.168.XXX.XXX:XXXX at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult) at System.Net.Sockets.TcpClient.EndConnect(IAsyncResult asyncResult) 
  • 问题绝对不是拥塞,即使只有一个客户端启动并运行,也会在网络流量最小的几个小时发生这种情况。
  • 我可以看到在调用BeginConnect后很快就调用了BeginConnect ,没有花时间在ar.AsyncWaitHandle.WaitOne

我的问题是如何调试此类错误? 服务器此时肯定是在运行。

问题似乎与Windows睡眠模式有关。 当机器处于睡眠状态时,偶尔会产生这些exception。

使用SetThreadExecutionState概述的SetThreadExecutionState禁用睡眠模式似乎已经解决了这个问题。

不过,我不知道为什么我在这种情况下获得SocketExceptions。 我能理解计时器是否完全没有发射,但不确定为什么连接会失败。