在本地千兆网络上,我有一个使用单个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
调用后很快就会调用BeginConnect
,ar.AsyncWaitHandle.WaitOne
内没有时间。我的问题是如何调试此类错误?服务器此时肯定是在运行。
答案 0 :(得分:0)
问题似乎与Windows睡眠模式有关。当机器处于睡眠状态时,偶尔会产生这些异常。
按照SetThreadExecutionState
概述使用here禁用睡眠模式似乎已经解决了这个问题。
但是,我不确定为什么我在这种情况下获得SocketExceptions。我能理解计时器是否根本没有发射,但不确定为什么连接会失败。