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