分享

Linux操作系统下TCP keepalive属性查看

 CevenCheng 2011-10-20
【转】 Linux操作系统下TCP keepalive属性查看
2011-07-08 08:59
转载自 分享
最终编辑 eckelchung
Tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:

 

a. 连接的对端正常关闭.

 

b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法通知对端的,所以连接会一直存在,浪费国家的资源.

 

tcp协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属 性的默认值很大.

 

全局设置可更改/etc/sysctl.conf,加上:

 

 

net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 60

 

在程序中设置如下:

 

 

#include 
#include
#include
#include
#include
int keepAlive = 1; // 开启keepalive属性
int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
int keepInterval = 5; // 探测时发包的时间间隔为5 秒
int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

 

在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有 收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多