Socket与拔掉网线

   当客户端与服务端通过Tcp Socket进行通信时,如果客户端应用正常退出或异常退出,服务端都会在对应的连接上获取感知(如返回0、或抛出异常)。但是,如果客户端的网线被拔掉,那么,默认情况下,服务端需要在2个小时后才会感知客户端掉线。对于很多服务端应用程序来说,这么长的反应时间是不能忍受的。
   我们通常在应用层使用“心跳机制”来解决类似的问题,这是可行的。
   然而,在这里,我们可以使用Socket自己的心跳机制来解决这一问题。 System.Net.Sockets.Socket提供了IOControl()方法给我们来设置Sokect的心跳机制的相关参数。比如,我们设置KeepAlive的时间为20秒,检查间隔为2秒。可以这样做:
            int keepAlive = -1744830460// SIO_KEEPALIVE_VALS
            byte[] inValue = new byte[] { 10000x200x4e000xd00x0700 }; //True, 20 秒, 2 秒
            sock.IOControl(keepAlive, inValue, null);
   20秒(20000毫秒)的16进制表示是4e20,2秒(2000毫秒)的16进制表示是07d0,如此,你可以修改inValue参数为自己希望的值。
   在上述设置下,如果拨掉客户端网线,服务器Socket.Receive()会在20秒后抛出异常(注意,在这20秒服务端内无论是从该socket上接收消息还是发送消息都不会抛出异常!)。

posted on 2007-05-28 17:10 zhuweisky 阅读(3086) 评论(3) 编辑 收藏

评论

#1楼 2007-06-11 17:12 sopper[未注册用户]

去试试
如果真得可以
就太爽了
谢谢楼主
 回复 引用   

#2楼 2007-10-29 15:47 kerry jiang[未注册用户]

希望能解决我的问题!  回复 引用   

#3楼 2007-12-24 14:19 蛙蛙池塘      

在C#中利用Keep-Alive处理Socket网络异常断开的方法
http://www.cnblogs.com/wzd24/archive/2007/05/22/755050.html
[AsyncHandle]什么引发了ObjectDisposedException?
http://blog.csdn.net/zhengyun_ustc/archive/2006/09/19/1246115.aspx
在C#中实现Socket端口复用
http://www.cnblogs.com/wzd24/archive/2007/05/22/755016.html
 回复 引用 查看   

导航

公告

             

人的灵魂要强,

接受人的脆弱。

昵称:zhuweisky
园龄:6年7个月
荣誉:推荐博客
粉丝:206
关注:10

统计

搜索

 
 

随笔分类(266)

随笔档案(282)

积分与排名

最新评论

阅读排行榜

推荐排行榜