gpt4 book ai didi

c# - 模拟套接字硬断开

转载 作者:太空宇宙 更新时间:2023-11-03 19:33:28 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com