Mic*_*lli 1 .net c# sockets networking
我有一个C#应用程序,其中服务器和一些客户端使用套接字从不同的计算机进行通信.
大多数情况下,服务器在sock.Receive(...)调用中接收到0个字节时会正确检测到断开连接.但是当出现硬件问题时(例如拔掉网络电缆),就会出现问题.一个服务器线程继续在sock.Receive(...)上阻塞,因为它不知道连接丢失了.我打算添加一个心跳消息来检测这个,但我想在dev中测试它.
但我不确定如何在没有实际硬件问题的情况下测试这种情况.即使我刚刚终止客户端进程,套接字也会以某种方式设法优雅地断开连接(也就是说,服务器读取0字节).只有当我从网络中拔出客户端机器时才会看到此问题.
有什么方法可以在dev中模拟这个问题吗?
在关闭套接字后,您需要明确告知WinSock您不希望它为您清理.这是通过如下设置来完成的LingerState:
socket.LingerState = new LingerOption(true, 0);
socket.Close();
Run Code Online (Sandbox Code Playgroud)
LingerState是有点混乱,因为如果你禁用了灵儿方法,Winsock 将实际挥之不去,但只是不能阻止你的程序.您必须启用"延迟"并将"延迟超时"设置为零,以强制WinSock断开连接.
PS如果你想要一些关于keepalive数据包(心跳)的信息,我写了一篇关于这个主题的博客文章.
更新:
我重新阅读你的问题(和评论),我的答案是错的......
上面的代码将模拟一个失败的关闭,而不是半开放的情况.没有办法模拟软件中的半开放情况; 您需要拔掉未连接到任何一台计算机的以太网电缆以进行测试(例如,在此配置中将两根交换机之间的电缆拉出:计算机A < - >开关< - >开关< - >计算机B).