socket 与拔掉网线
来源:互联网 发布:windows 10怎么搜游戏 编辑:程序博客网 时间:2024/04/28 12:06
当客户端与服务端通过Tcp Socket进行通信时,如果客户端应用正常退出或异常退出,服务端都会在对应的连接上获取感知(如返回0、或抛出异常)。但是,如果客户端的网线被拔掉,那么,默认情况下,服务端需要在2个小时后才会感知客户端掉线。对于很多服务端应用程序来说,这么长的反应时间是不能忍受的。
我们通常在应用层使用“心跳机制”来解决类似的问题,这是可行的。
然而,在这里,我们可以使用Socket自己的心跳机制来解决这一问题。 System.Net.Sockets.Socket提供了IOControl()方法给我们来设置Sokect的心跳机制的相关参数。比如,我们设置KeepAlive的时间为20秒,检查间隔为2秒。可以这样做:
在上述设置下,如果拨掉客户端网线,服务器Socket.Receive()会在20秒后抛出异常(注意,在这20秒服务端内无论是从该socket上接收消息还是发送消息都不会抛出异常!)。
我们通常在应用层使用“心跳机制”来解决类似的问题,这是可行的。
然而,在这里,我们可以使用Socket自己的心跳机制来解决这一问题。 System.Net.Sockets.Socket提供了IOControl()方法给我们来设置Sokect的心跳机制的相关参数。比如,我们设置KeepAlive的时间为20秒,检查间隔为2秒。可以这样做:
int keepAlive = -1744830460; // SIO_KEEPALIVE_VALS
byte[] inValue = new byte[] { 1, 0, 0, 0, 0x20, 0x4e, 0, 0, 0xd0, 0x07, 0, 0 }; //True, 20 秒, 2 秒
sock.IOControl(keepAlive, inValue, null);
20秒(20000毫秒)的16进制表示是4e20,2秒(2000毫秒)的16进制表示是07d0,如此,你可以修改inValue参数为自己希望的值。byte[] inValue = new byte[] { 1, 0, 0, 0, 0x20, 0x4e, 0, 0, 0xd0, 0x07, 0, 0 }; //True, 20 秒, 2 秒
sock.IOControl(keepAlive, inValue, null);
在上述设置下,如果拨掉客户端网线,服务器Socket.Receive()会在20秒后抛出异常(注意,在这20秒服务端内无论是从该socket上接收消息还是发送消息都不会抛出异常!)。
阅读全文
0 0
- Socket与拔掉网线
- Socket与拔掉网线
- Socket与拔掉网线
- Socket与拔掉网线
- Socket与拔掉网线
- socket 与拔掉网线
- 拔掉网线时Socket的检查方法
- 拔掉网线时Socket的检查方法
- Vxworks下检测关于socket连接关闭的问题-----拔掉网线或超时,自动断开
- java中使用socket进行udp方式通信时拔掉网线会导致send()方法阻塞
- linux TCP编程处理网线拔掉
- 如何在每次拔掉网线时都能收到通知?
- 如何在每次拔掉网线时都能收到通知?
- 网络连接状态来判断,网线是不是被拔掉了
- tcp 连接 判断 网线被拔掉的情况
- extremeDBHA拔掉网线从机数量不正确的错误
- ubuntu 拔掉网线后插上连不上网
- TCP连接拔掉网线后会发生什么
- 安卓逆向(二)
- Android开发过程中的一些常识(持续更新)
- git合并分支报错 :Branch 'master' is protected and commits must be merged through pull request
- 机器学习之离散型特征处理--独热码(one_hot_encoding)
- linux netstat tcpdump ipcs ipcrm
- socket 与拔掉网线
- CocoaPods的安装及应用 mac8.0
- Android 控件添加边框线(全部画线,其他边画线)
- Struts2 下载 Can not find a java.io.InputStream with the name [downloadFile] in the invocation stack
- 深入理解Java注解Annotation及自定义注解
- python Numpy中array详解
- 微信红包内容读取
- 1253:Dungeon Master(2.5基本算法之搜索)
- jquery 判断js中是否包含字符串