linux下socket连接下的心跳机制

1,在长连接下,有可能很长1段时间都没有数据来往

理论上说,这个连接是1直保持连接的,但是实际情况中,如果中间节点出现甚么故障是难以知道的。

有的节点(防火墙)会自动把1定时间以内没有数据交互的连接给断掉。

在这个时候,就需要我们的心跳包了,用于保持长连接,保活

2,心跳包之所以叫心跳包是由于:它像心跳1样每隔固定时间发1次,以此来告知服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有甚么特别规定的,不过1般都是很小的包,或只包括包头的1个空包。心跳包主要也就是用于长连接的保活和断线处理。1般的利用下,判定时间在30⑷0秒比较不错。如果实在要求高,那就在6⑼秒。

3,下面为封装好的心跳包函数,加入项目中参数设置1下便可

#include <netinet/tcp.h>
//参数解释
//fd:网络连接描写符
//start:首次心跳侦测包发送之间的空闲时间
//interval:两次心跳侦测包之间的间隔时间
//count:探测次数,行将几次探测失败判定为TCP断开
int set_tcp_keepAlive(int fd, int start, int interval, int count)
{
int keepAlive = 1;
if (fd < 0 || start < 0 || interval < 0 || count < 0) return ⑴; //入口参数检查 ,编程的好习惯。
//启用心跳机制,如果您想关闭,将keepAlive置零便可
if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//启用心跳机制开始到首次心跳侦测包发送之间的空闲时间
if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//两次心跳侦测包之间的间隔时间
if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
//探测次数,行将几次探测失败判定为TCP断开
if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count)) == ⑴)
{
perror("setsockopt");
return ⑴;
}
return 0;
}

将想设置的参数传入该函数,设置成功返回0,否则返回⑴。设置成功以后,可以将fd交给select去监听可读可写事件,如果select检测到fd可读且read返回毛病,1般就可以判定该fd对应的TCP连接已异常断开,调用close函数将fd关闭便可。

TCP连接非正常断开的检测(KeepAlive探测)

此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的缘由,还有突然主机断电等缘由

有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测

第2种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测。

从而得知连接已失效,客户端程序便有机会及时履行清除工作、提示用户或重新连接

波比源码 – 精品源码模版分享 | www.bobi11.com
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 本站源码并不保证全部能正常使用,仅供有技术基础的人学习研究,请谨慎下载
8. 如遇到加密压缩包,请使用WINRAR解压,如遇到无法解压的请联系管理员!

波比源码 » linux下socket连接下的心跳机制

发表评论

Hi, 如果你对这款模板有疑问,可以跟我联系哦!

联系站长
赞助VIP 享更多特权,建议使用 QQ 登录
喜欢我嘛?喜欢就按“ctrl+D”收藏我吧!♡