Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4244892
  • 博文数量: 776
  • 博客积分: 13014
  • 博客等级: 上将
  • 技术积分: 10391
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 17:00
文章分类

全部博文(776)

文章存档

2015年(55)

2014年(43)

2013年(147)

2012年(20)

2011年(82)

2010年(429)

分类: LINUX

2015-01-26 14:44:03

http://blog.csdn.net/chenggong2dm/article/details/9158857

TCP正常的断开,通信双方(服务端和客户端)都是能知道的。但是非正常的断开,比如直接拔掉了网线,就只能靠如下两种方法,实现短时间内的检测。
    一,心跳包机制
    心跳包机制,是网游设计中的常用机制。从用户层面,自己发包去判断对方连线状态。可以根据情况,很灵活的使用。比如,20秒发送一个最小的数据包(也可以根据实际情况稍带一些其他数据)。如果发送没有回应,就判断对方掉线了。

    二,利用tcp_keepalive机制
    利用TCP的机制,通过设置系统参数,从系统层面,监测tcp的连接状态。以下为linux下的方法:
    1,首先查看系统tcp_keepalive相关参数(centos和Ubuntu)
     # sysctl -a|grep tcp_keepalive
显示如下:
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
    分别说一下这三个参数:
tcp_keepalive_time 参数:
    是指TCP发送keepalive消息的频度,默认为7200秒,也就是两个小时。
keepalive_intvl 参数:
    当探测没有确认时,重新发送探测的频度。默认是75秒。
keepalive_probes 参数:
    在认定连接失效之前,发送多少个TCP的keepalive探测包。默认值是9次。
--------------------------------------------------------------------
    2,修改系统的tcp_keepalive相关参数
    在知道以上三个系统参数的定义和作用之后,我们来修改一下这三个参数:
    修改/etc/sysctl.conf文件:
    # vi /etc/sysctl.conf
    在打开的文件中,加入如下三行:
net.ipv4.tcp_keepalive_intvl = 1 net.ipv4.tcp_keepalive_probes = 1
net.ipv4.tcp_keepalive_time = 5
    保存文件。
--------------------------------------------------------------------
    3,重启服务器。
    # reboot
    附注:或者临时使系统设置生效也行:# sysctl -p
 
--------------------------------------------------------------------
    4,修改程序代码部分。
注意:仅仅配置内核参数是不够的,还必须在编程的时候设置套接字的选项,调用函数是
socket.setsockopt(level, optname, value) 
示例:
level为SOL_SOCKET的话,选项为SO_KEEPALIVE,值为布尔。
socket.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, True)  

此外还可以设置TCP选项(设置的level为SOL_TCP而不是SOL_SOCKET)覆盖系统全局设置
TCP_KEEPCNT  与tcp_keepalive_probes 对应
TCP_KEEPIDLE 与tcp_keepalive_time 对应
TCP_KEEPINTVL 与tcp_keepalive_intvl 对应
阅读(1500) | 评论(0) | 转发(0) |
0

上一篇:tmp

下一篇:QT::关于QString的字符串处理

给主人留下些什么吧!~~