c# – 当网络电缆断开与网络适配器的连接时,如何获取套接字的状态

c# – 当网络电缆断开与网络适配器的连接时,如何获取套接字的状态,第1张

概述我在不同的计算机上用C#,服务器和客户端程序编写了一个带c / s模式的通信程序.今天客户端程序连接到服务器progarm后,我从网络适配器拔出电缆(此后,客户端和服务器程序没有做任何事情),发生了奇怪的事情.我发现服务器程序的socket仍然保持连接状态.我使用命令“netstat -a -n”来检索网络信息,并获得如下信息: TCP 192.168.1.2:3645 192.168.1.3:1 我在不同的计算机上用C#,服务器和客户端程序编写了一个带c / s模式的通信程序.今天客户端程序连接到服务器progarm后,我从网络适配器拔出电缆(此后,客户端和服务器程序没有做任何事情),发生了奇怪的事情.我发现服务器程序的socket仍然保持连接状态.我使用命令“netstat -a -n”来检索网络信息,并获得如下信息:

TCP 192.168.1.2:3645 192.168.1.3:1863已建立

192.168.1.2(服务器IP地址)
192.168.1.3(客户端IP地址)

有人知道原因吗?如何解决这个问题呢 .
我想知道服务器程序如何接收事件并在拔出客户端计算机的网络电缆时关闭套接字.

请给我一些建议或解决方案.

谢谢

解决方法 我认为可以通过使用TCP keepalive来解决.
refrence http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

连接后,设置socket keepalive属性. msdn说这个开关默认状态是关闭的,如果将keepalive设置为on,socket会自动检查网络状态,并且在socket上次 *** 作后首先检查时间是2小时.但时间可以缩短.然后在第一次检查后,套接字将服务时间.如果连接中断或死亡,
socket会抛出异常.

C#来源:

uint dummy = 0;    byte[] inoptionValues = new byte[Marshal.SizeOf(dummy) * 3];    //set keepalive on    BitConverter.GetBytes((uint)1).copyTo(inoptionValues,0);     //interval time between last operation on socket and first checking. example:5000ms=5s    BitConverter.GetBytes((uint)5000).copyTo(inoptionValues,Marshal.SizeOf(dummy));    //after first checking,socket will check serval times by 1000ms.    BitConverter.GetBytes((uint)1000).copyTo(inoptionValues,Marshal.SizeOf(dummy) * 2);    Socket socket = __ClIEnt.ClIEnt;    socket.IOControl(IOControlCode.KeepAliveValues,inoptionValues,null);

我检查过.它运行正常.

总结

以上是内存溢出为你收集整理的c# – 当网络电缆断开与网络适配器的连接时,如何获取套接字的状态全部内容,希望文章能够帮你解决c# – 当网络电缆断开与网络适配器的连接时,如何获取套接字的状态所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1216499.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存