socket KeepAlive 使用笔记(转)


1.问题 linux

     最近碰到的一个问题,socket链接一台服务器后,若是无数据通信,服务器会在几分钟后关闭socket。由此产生一个问题。与服务器进行链接后,拔掉网线,几分钟后,因为服务器已经关闭socket,但客户这边还认为已经链接的是正确的socket。所以产生一些操做上的延迟问题。 服务器

2.分析 网络

    因为服务器已经关闭的客户端的链接,因此客户端也得关闭超时的链接。所以我选用keepalive方法来定时的探测网络是否存在。若是服务器3分钟关闭socket,那客户端只要稍小于3分钟探测一次就能够了。 socket

   若是keepalive探测失败,那就能够用select语句捕获到socket须要read,调用一下recv若是返回错误就表示超时了,本socket已经无效,本身进行错误处理了。 tcp

   还有值得注意的是服务器也必须支持keepalive.单方面那是没有用的。 ip

3.具体代码 it

   本人的客户端是linux2.4.x
keepalive选项的设置是全系统有效的,设置以下 select

echo 170 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes 方法

以上增长到系统启动脚本/etc/init.d/****中 im

tcp_keepalive_time  //每次确认包发送的间隔时间
tcp_keepalive_probes//每次确认最多重发次数
tcp_keepalive_intvl //重试间隔
单位秒

//启用socket链接的保持链接包的发送
int iKeepAlive = 1;
setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, (void *)&iKeepAlive, sizeof(iKeepAlive)); 

用select 语句获取read状态,recv返回错误后进行错误处理,具体不在详述了

相关文章
相关标签/搜索