下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、心跳包的发送,通常有两种技术方法1:应用层自己实现的心跳包由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个Timer事件中定时向客户端发送一个短小精悍的数据包,然后启动一个低级别的线程,在该线程中不断检测客户端的回应,如果在一定时间内没有收到客户端的回应,即认为客户端已经掉线;同样,如果客户端在一定时间内没有收到服务器的心跳包,则认为连接不可用。方法2:TCP的KeepAlive保活机制因为要考虑到一个服务器通常会连接多个客户端,因此由用户在应用层自己实现心跳包,代码较多且稍显复杂,而利用TCP/IP协议层为内置的KeepAlive功能来实现心跳功能则简单得多。不论是服务
2、端还是客户端,一方开启KeepAlive功能后,就会自动在规定时间内向对方发送心跳包,而另一方在收到心跳包后就会自动回复,以告诉对方我仍然在线。因为开启KeepAlive功能需要消耗额外的宽带和流量,所以TCP协议层默认并不开启KeepAlive功能,尽管这微不足道,但在按流量计费的环境下增加了费用,另一方面,KeepAlive设置不合理时可能会因为短暂的网络波动而断开健康的TCP连接。并且,默认的KeepAlive超时需要7200000Milliseconds,即2小时,探测次数为5次。对于很多服务端应用程序来说,2小时的空闲时间太长。因此,我们需要手工开启KeepAlive功能并设置合理的
3、KeepAlive参数。心跳包机制跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,
4、然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀当然,这个自然是要由逻辑层根据需求去做了。总的来说,心跳包主要
5、也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。心跳检测步骤:1、客户端每隔一个时间间隔发生一个探测包给服务器2、客户端发包时启动一个超时定时器3、服务器端接收到检测包,应该回应一个包4、如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器5、如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了根据上面的介绍我们可以知道对端以一种非优雅的方式断开连接的时候,我们可以设置SO_KEEPALIVE属性使得我们在2小时以后发现对方的TCP连接是否依然存在。具体操作:设置KeepAlive1、BOOLbKeepAli
6、ve=TRUE;intnRet=setsockopt(sockClient,SOL_SOCKET,SO_KEEPALIVE,(constchar*)&bKeepAlive,sizeof(bKeepAlive);if(nRet!=0)AfxMessageBox("出错”);return-1;2、感觉两小时时间太长可以自行设定方法1设置KeepAlive检测时间和次数tcp_keepaliveinKeepAlive=0;输入参数unsignedlongulInLen=sizeof(tcp_keepalive);tcp_keepaliveoutKeepAlive=0;输出参数uns
7、ignedlongulOutLen=sizeof(tcp_keepalive);unsignedlongulBytesReturn=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,u
8、lInLen,(LPVOID)&outKeepAlive,ulOutLen,&ulBytesReturn,NULL,NULL);if(SOCKET_ERROR=nRet)AfxMessageBox("出错”);return;3、感觉两小时时间太长可以自行设定方法2因此我们可以得到intkeepIdle=6;intkeepinterval=5;intkeepCount=3;Setsockopt(listenfd,SOL_TCP,TCP_KEEPIDLE,(void*)&keepidle,sizeof(keepIdle);Setsockopt(listenfd,SOL_TCP,TCP_KEEPINTVL
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026校招:福建港口集团笔试题及答案
- 2026校招:大亚科技集团笔试题及答案
- 2025-2026学年痏拼音教学设计幼儿园
- 2025-2026学年江西省南昌中学高三(上)期末地理试卷
- 【现代农艺类】2023年山东省普通高校招生(春季)全省统一考试专业知识试题(含答案)
- 2025-2026学年syb培训教案
- 2025-2026学年小学音乐游戏式教学设计
- 水生动物检疫防疫员班组安全能力考核试卷含答案
- 2026年山西省阳泉市单招职业适应性测试题库含答案详解ab卷
- 2026年广州番禺职业技术学院单招职业技能测试题库附答案详解(模拟题)
- 肩袖损伤中医护理查房
- 工程施工质量检验批划分及计划
- 新教材 第1课《土地上的农民》课件-七年级美术下册(岭南美版2024)
- 关于余华的论文开题报告
- 口腔门诊员工绩效考核与激励
- 施工检查记录仪使用及管理制度(含设备台账表)
- 尿失禁盆底康复治疗
- 大学生安全教育践行国家总体安全观
- 事业单位工作人员调动申报表
- 2024年宁夏安全员B证考试题库附答案
- 廉洁应征承诺书
评论
0/150
提交评论