心跳包的发送,通常有两种技术

方法1:应用层自己实现的心跳包

由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应, 如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没 有收到服务器的心跳包,则认为连接不可用。

方法2:TCP的KeepAlive保活机制

因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多 且稍显复杂,而利用TCP/IP协议层为内置的KeepAlive功能来实现心跳功能则简单得多。 不论是服务端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包, 而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。 因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不开启KeepAlive功 能,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,KeepAlive设置不合理时可能会 因为短暂的网络波动而断开健康的TCP连接。并且,默认的KeepAlive超时需要7,200,000 MilliSeconds, 即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长。因此,我们需要手工开启KeepAlive功能并设置合理的KeepAlive参数。

心跳包机制

跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。

在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。

心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。

其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。

在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。

总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

心跳检测步骤:

1客户端每隔一个时间间隔发生一个探测包给服务器

2客户端发包时启动一个超时定时器

3服务器端接收到检测包,应该回应一个包

4如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器

5如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

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

具体操作:

//设置KeepAlive

1、 BOOL bKeepAlive = TRUE;

int nRet=::setsockopt(sockClient,SOL_SOCKET,SO_KEEPALIVE,(char*)&bKeepAlive,sizeof(bKeepAlive));

if(nRet!=0)

{

AfxMessageBox("出错");

return ;

}

2、感觉两小时时间太长可以自行设定方法1

//设置KeepAlive检测时间和次数

tcp_keepalive inKeepAlive = {0}; //输入参数

unsigned long ulInLen = sizeof(tcp_keepalive );

tcp_keepalive outKeepAlive = {0}; //输出参数

unsigned long ulOutLen = sizeof(tcp_keepalive );

unsigned long ulBytesReturn = 0;

//设置socket的keep alive为10秒,并且发送次数为3次

inKeepAlive.onoff = 1;

inKeepAlive.keepaliveinterval = 4000; //两次KeepAlive探测间的时间间隔

inKeepAlive.keepalivetime = 1000; //开始首次KeepAlive探测前的TCP空闭时间

nRet=WSAIoctl(sockClient,

SIO_KEEPALIVE_VALS,

(LPVOID)&inKeepAlive,

ulInLen,

(LPVOID)&outKeepAlive,

ulOutLen,

&ulBytesReturn,

NULL,

NULL);

if(SOCKET_ERROR == nRet)

{

AfxMessageBox("出错");

return;

}

3、感觉两小时时间太长可以自行设定方法2

因此我们可以得到

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));

linux心跳包检测代码_Socket心跳包机制相关推荐

  1. linux心跳包检测代码_OpenSSL心跳包越界读敏感信息泄漏漏洞

    发布日期:2014-04-10 CVE ID:CVE-2014-0160 受影响的软件及系统: ==================== OpenSSL 1.0.1-OpenSSL 1.0.1f Op ...

  2. cppcheck卸载linux,使用cppcheck检测代码警告、错误

    cppcheck是一个C/C++静态检查工具.它可以帮助我们检测出代码存在(潜在)的问题,比如数组越界.内存申请未释放.文件打开未关闭.注意,cppcheck不是编译器,替代不了gcc. 在ubunt ...

  3. 两个iwatch互动心跳_iWatch检测到男子心跳出现异常!没想到救了他一命!

    在去年的11月,Jorge前往医院做扁桃体切除手术时,被护士询问他是否有心脏病或任何其它相关的病史时,Jorge便把iWatch时不时提醒他心率异常的情况告诉护士,为了确保手术万无一失,医生对他的对他 ...

  4. 网络分流器-DPI深度数据包检测

    网络分流器-戎腾网络-DPI检测是当前比较流行的网络监控前端的一种模式,而网络分流器对于网络安全的重要性可以说是到头重要的!今天我们来聊聊DPI检测 深度数据包检测(DPI) 深度数据包检测(Deep ...

  5. 网络分流器-网络分流器-DPI深度数据包检测

    网络分流器-戎腾网络-DPI检测是当前比较流行的网络监控前端的一种模式,而网络分流器对于网络安全的重要性可以说是到头重要的!今天我们来聊聊DPI检测 深度数据包检测(DPI) 深度数据包检测(Deep ...

  6. socket心跳机制图片_socket心跳包机制

    心跳包 心跳包就是在客户端和服务器间定时通知对方自己状态的一个自己定义的命令字,按照一定的时间间隔发送,类似于心跳,所以叫做心跳包 心跳包的作用 网络中的接收和发送数据都是使用SOCKET进行实现.但 ...

  7. netty的编解码、粘包拆包问题、心跳检测机制原理

    文章目录 1. 编码解码器 2. 编解码序列化机制的性能优化 3. Netty粘包拆包 4. Netty心跳检测机制 5. Netty断线自动重连实现 1. 编码解码器 当你通过netty发送或者接受 ...

  8. 心跳检测以及应用层心跳包机制设计

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...

  9. 闲说HeartBeat心跳包和TCP协议的KeepAlive机制

    很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据.使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议. ...

最新文章

  1. 丢失msvcr120d.dll、msvcr120.dll、msvcp120d.dll、msvcp120.dll问题解决方法
  2. Java蓝牙电话_Android mediaPlayer和蓝牙汽车/耳机电话
  3. qt 回调函数设置界面_回调函数实现类似QT中信号机制(最简单)
  4. Java黑皮书课后题第8章:*8.21(中心城市)给定一组城市,中心城市是和其它所有城市具有最短距离的城市。编写一个程序,提示用户输入城市数目以及位置(坐标),找到中心城市以及与其他城市总距离
  5. 说说基于网络的五种IO模型
  6. 这个故事告诉你,拥有吃不胖的超能力就无忧无虑
  7. mysql 建表覆盖原先表_mysql表与表之间建关系
  8. 电影院终于要开门了!一大波搁浅的春节档大片即将上映...
  9. python需要缩进的块_“需要缩进块”
  10. fabric 启动peer_Hyperledger Fabric Peer 常用命令总结
  11. Spark 概念学习系列之从spark架构中透视job(十六)
  12. google 安裝包 android,googleplaystore安装包
  13. 微信小程序底部导航栏小效果
  14. 人大金仓数据库迁移步骤
  15. 0基础学RS(十三)思科交换机上的Access模式和trunk模式以及配置
  16. 深投控合作之后 国美更具有想象力
  17. the little schemer 笔记(1)
  18. java修改文件只读_java修改文件为只读权限
  19. 如何让多个word文档合并成一个
  20. VC通过ADO操作Access2007数据库

热门文章

  1. 解决桌面文件图标变黑方法
  2. 使用vika维格表来管理寺庙原来如此轻松~
  3. 谷歌三大核心技术(一)The Google File System中文版
  4. 学习python数据分析路线图_henry_dx_新浪博客
  5. 全志JAVA_全志a13开发总结
  6. android 印度语_改善印度语维基百科的8个挑战
  7. 解Bug之路-主从切换”未成功”?
  8. 二零二年度网络电话软件综合测评
  9. c++类型转换:static_cast, dynamic_cast,const_cast和reinterpret_cast
  10. 17家IT创业公司的血泪史(2)