偶发TCP连接失败(WSAEHOSTUNREACH)

时间:2014-02-18 08:15:10

标签: c# sockets tcp asyncsocket socketexception

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

服务器使用SocketAsyncEventArgs进行设置,与显示HERE的示例非常相似(为简洁起见省略)

客户端使用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%的时间会抛出异常。

例外是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)
  • 问题绝对不是拥塞,即使只有一个客户端启动并运行,也会在网络流量最小的几个小时发生这种情况。
  • 我可以看到EndConnect调用后很快就会调用BeginConnectar.AsyncWaitHandle.WaitOne内没有时间。

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

1 个答案:

答案 0 :(得分:0)

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

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

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