SO_KEEPALIVE套接口选项转载 so keepalive

目前手头有个关于心博功能的一个案例, 在使用SOL_SOCKET, SO_KEEPALIVE上有一点心得,想写出来和大家分享一下。

关于SOL_SOCKET选项SO_KEEPALIVE有一个很详细的英文How TO, 在下面的网页中大家可以看到详细的内容

[url=http://www.icewalkers.com/Linux/Howto/TCP-Keepalive-HOWTO/index.html]http://www.icewalkers.com/Linux/Howto/TCP-Keepalive-HOWTO/index.html[/url]

在《UNIX网络编程第1卷》中也有详细的阐述:

SO_KEEPALIVE

保持连接检测对方主机是否崩溃,避免(服务器)永远阻塞于TCP连接的输入。设置该选项后,如果2小时内在此套接口的任一方向都没有数据交换,TCP就自

动给对方 发一个保持存活探测分节(keepalive

probe)。这是一个对方必须响应的TCP分节.它会导致以下三种情况:对方接收一切正常:以期望的ACK响应。2小时后,TCP将发出另一个探测分

节。对方已崩溃且已重新启动:以RST响应。套接口的待处理错误被置为ECONNRESET,套接

口本身则被关闭。对方无任何响应:源自berkeley的TCP发送另外8个探测分节,相隔75秒一个,试图得到一个响应。在发出第一个探测分节11分钟

15秒后若仍无响应就放弃。套接口的待处理错误被置为ETIMEOUT,套接口本身则被关闭。如ICMP错误是“host

unreachable(主机不可达)”,说明对方主机并没有崩溃,但是不可达,这种情况下待处理错误被置为 EHOSTUNREACH。

在该书的第158页有更详细的描述。

根据上面的介绍我们可以知道对端以一种非优雅的方式断开连接的时候,我们可以设置SO_KEEPALIVE属性使得我们在2小时以后发现对方的TCP连接是否依然存在。

keepAlive = 1;

Setsockopt(listenfd, SOL_SOCKET, SO_KEEPALIVE, (void*)&keepAlive, sizeof(keepAlive));

如果我们不能接受如此之长的等待时间,从TCP-Keepalive-HOWTO上可以知道一共有两种方式可以设置,一种是修改内核关于网络方面的

配置参数,另外一种就是SOL_TCP字段的TCP_KEEPIDLE, TCP_KEEPINTVL, TCP_KEEPCNT三个选项。

The tcp_keepidle parameter specifies the interval of inactivity

that causes TCP to generate a KEEPALIVE transmission for an application

that requests them. tcp_keepidle defaults to 14400 (two hours).

/*开始首次KeepAlive探测前的TCP空闭时间 */

The tcp_keepintvl parameter specifies the interval between the nine

retries that are attempted if a KEEPALIVE transmission is not

acknowledged. tcp_keepintvl defaults to 150 (75 seconds).

/* 两次KeepAlive探测间的时间间隔*/

The TCP_KEEPCNT option specifies the maximum number of keepalive

probes to be sent. The value of TCP_KEEPCNT is an integer value between

1 and n, where n is the value of the systemwide tcp_keepcnt parameter.

/* 判定断开前的KeepAlive探测次数 */

因此我们可以得到

int keepIdle = 6;

int keepInterval = 5;

int keepCount = 3;

Setsockopt(listenfd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));

Setsockopt(listenfd, SOL_TCP,TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));

Setsockopt(listenfd,SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));

我们需要注意的TCP-Keepalive-HOWTO上这段话:

Remember that keepalive is not program?related, but socket?related,

so if you have multiple sockets, you can handle keepalive for each of

them separately.

这些属性是sockt继承的,非整个代码内的所有sockets都继承这个属性,因为如果要应用到多个套接口上必须分别使用Setsockopt, Setsockopt是setsockopt的包裹函数。

如果心搏函数要维护客户端的存活,即服务器必须每隔一段时间必须向客户段发送一定的数据,那么使用SO_KEEPALIVE是有很大的不足的。因为

SO_KEEPALIVE选项指"此套接口的任一方向都没有数据交换",我不知道大家是怎么理解这个实现的。在Linux

2.6系列上,上面话的理解是只要打开SO_KEEPALIVE选项的套接口端检测到数据发送或者数据接受就认为是数据交换。

因此在这种情况下使用 SO_KEEPALIVE选项 检测对方是否非正常连接是完全没有作用的,在每隔一段时间发包的情况,

keep-alive的包是不可能被发送的。上层程序在非正常端开的情况下是可以正常发送包到缓冲区的。非正常端开的情况是指服务器没有收到"FIN"

或者 "RST"包。

SO_KEEPALIVE套接口选项(转载) so keepalive
当然这种情况也是比较好断定对方是否存活,我提出来的主要原因是想看看大家对"此套接口的任一方向都没有数据交换"是怎么去理解的。

[b]本文来自ChinaUnix博客,如果查看原文请点:[/b][url]http://blog.chinaunix.net/u2/63316/showart_1732853.html[/url]

  

爱华网本文地址 » http://www.aihuau.com/a/25101011/53804.html

更多阅读

转载 第二十八批:又上传了23套易学资料,送给广大易友

原文地址:第二十八批:又上传了23套易学资料,送给广大易友作者:沁阳有易第二十八批:又上传了23套易学资料,送给广大易友好久没跟大家汇报了,跟大家汇报下,我找了一份新的工作,月薪2300包吃住,试用期一个月,在公司做QC,工作还算简单,最近正忙着接

转载 excel支票套打王软件的优点和功能讲解 支票套打模板

原文地址:excel支票套打王软件的优点和功能讲解作者:excel支票套打王 各位朋友请进入我的QQ空间,欣赏一段动画演示,就能看到此软件的惊人效果了。点击此处进入我的QQ空间欣赏动画演示。 上面这张动画显示,该软件在几秒钟之内神奇地填写好

转载 梅建平:艺术品或将取代房产成为未来投资新选项

原文地址:梅建平:艺术品或将取代房产成为未来投资新选项作者:陈志平波段手“先比车,后比房,再比墙(挂着的字画)”,一批拥有财富的人正在经历这一转变过程。在这个高通胀的时代,任何能增值保值的品种都成为了投资青睐的对象,书画更是一马当先

转载 奶瓶套与八爪章鱼的钩针编织教程-女红网 女红网钩针编织

原文地址:奶瓶套与八爪章鱼的钩针编织教程-【女红网】作者:爱上编织今天我的作品是奶瓶套,当然也可以是平时喝水的玻璃水杯套。不管是奶瓶套还是水杯套,有了这个,冬天喝水就不怕这么快就凉掉了。  有的小朋友喝奶非常地慢,市场上买一个

声明:《SO_KEEPALIVE套接口选项转载 so keepalive》为网友清风醉分享!如侵犯到您的合法权益请联系我们删除