我有一个C#应用程序,其中服务器和一些客户端使用套接字从不同的计算机进行通信。
大多数情况下,服务器在sock.Receive(...)调用中接收到0个字节时,会正确检测到断开连接。但是当出现硬件问题时(例如拔掉网络电缆),就会出现问题。一个服务器线程继续在sock.Receive(...)上阻塞,因为它不知道连接丢失了。我打算添加心跳消息来检测这个,但我想在开发中测试它。
但我不确定如何在没有实际硬件问题的情况下测试此案例。即使我刚刚终止客户端进程,套接字也会以某种方式设法优雅地断开连接(也就是说,服务器读取0字节)。只有当我从网络中拔出客户端机器时才能看到这个问题。
我有什么方法可以在dev中模拟这个问题吗?
答案 0 :(得分:5)
在关闭套接字后,您需要明确告知WinSock 不希望它为您清理。这可以通过设置LingerState
来完成:
socket.LingerState = new LingerOption(true, 0);
socket.Close();
LingerState
有点令人困惑,因为如果你禁用延迟,WinSock 将实际上停留但不会阻止你的程序。您必须启用“延迟”并将“延迟超时”设置为零,以强制WinSock断开连接。
P.S。如果您需要有关keepalive数据包(心跳)的一些信息,I've written a blog entry on the subject。
<强>更新强>
我重读了你的问题(和评论),我的回答是错误的......
上面的代码将模拟一个失败的关闭,而不是半开放的情况。没有办法模拟软件中的半开放情况;您需要拔掉未连接到任一计算机的以太网电缆以进行测试(例如,在此配置中拉动两个交换机之间的电缆:计算机A&lt; - &gt;开关&lt; - &gt;开关&lt; - &gt;计算机B)。