c# - 模拟套接字硬断开

标签 c# .net sockets networking

我有一个 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/

相关文章:

.net - 新项目,但包括遗留站点文件

c# - 通用列表是存储在 C# 中的堆栈还是堆中?

java - 即使我关闭套接字也会出现 java.net.BindException

c# - 不安全的指针迭代和位图——为什么 UInt64 更快?

c# - "Attributes"到底是什么?

c# - 改变我的命名空间是一件好事还是必要的?

c# - 如何在没有 INotifyPropertyChanged 的​​情况下生成 Web 服务引用?

python - 如何在 python 3.2 中解压缩 c 结构?

c - 从服务器获取数据时知道要接收多少

c# - 如何知道浏览器是否有 PDF 查看器?