UNIX网络编程——socket的keep-alive
阅读此博客时,可以参考后面的博客<<UNIX网络编程——客户/服务器心搏函数>>和<<UNIX网络编程——套接字选项(心跳检测、绑定地址复用)>>。
第一部分
【需求】
不影响服务器处理的前提下,检测客户端程序是否被强制终了。
【现状】
服务器端和客户端的Socket都设定了keepalive属性。
服务器端设定了探测次数等参数,客户端、服务器只是打开了keepalive机能
服务器端起了一个监视线程,利用select来检测socket是否被关闭。
下面这是我的一点肤浅理解。
1. 关于keep alive
无论windows还是linux,keepalive就三个参数:
对 于一个已经建立的tcp连接。如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 keepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有 收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。例如★:
- sk->keepalive_probes=3;
- sk->keepalive_time=30;
- sk->keepalive_intvl=1;