ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

19心跳包机制的实现

2022-03-21 11:03:03  阅读:207  来源: 互联网

标签:19 网线 队列 时间 心跳 机制 超时 连接


一、为什么引入心跳包

常规客户端关闭,服务器端能感知到;
一种特殊情况,连接断开c/s都感知不到:
拔掉c/s程序的网线; "拔掉网线导致服务器感知不到客户端断开",这个事实,大家一定要知道;那为了应对拔网线,导致不知道对方是否断开了tcp连接这种事,这就是我们引入心跳包机制的原因;超时没有发送来心跳包,那么就会将对端的socket连接close掉,回收资源;这就是心跳包的作用;
其他作用: 检测网络延迟。
tcp本身keepalive机制;因为检测时间不好控制,所以不适合。

二、实际代码

2.1 逻辑处理位置

ps:心跳包本身是作为一个数据包的格式传给服务器的,所以,具体的处理位置就是在业务处理代码上。
image
对于怎么去接收处理一个数据包的逻辑问题,在前面就已经讲过。这里直接上代码。
image

2.2 这个近期的最新时间是怎么被利用的

1.首先,是否踢人,和设置心跳包的时间是在配置文件中的。
image
2.当一个连接进来的时候,那么就把这个连接加入到时间队列中去

std::multimap<time_t, LPSTRUC_MSG_HEADER>   m_timerQueuemap;          //时间队列

image
image

3.创建一个服务处理到期不发心跳包用户的踢出连接的线程
image
4.线程入口函数ServerTimerQueueMonitorThread
(1)第一步就是把时间队列中最近的时间点取出进行判断(有没有到最近时间)
(2)要是比当前时间小,那么,时间队列中就有大于等于1个的超时(20S)连接,把这些超时连接放入另外一个队列中进行判断,比较的是,时间队列中的时间和当前时间。
image
(3)当另外一个队列不为空时,那么就放入pSocketObj->procPingTimeOutChecking(tmpmsg,cur_time);进行进行检查(可以说是二次检查)。这个函数是在连接的子类中实现的。比较的是,当前时间和这个连接的ping包时间。
image
(4)要是这个判断标准成立了,那么就主动关闭套接字。

PS:这里是三个时间,不一样的三个变量存储

2.3一些其他处理

比如说:
客户端主动关闭的套接字,就要将该连接从时间队列中取出出来。
image

标签:19,网线,队列,时间,心跳,机制,超时,连接
来源: https://www.cnblogs.com/haozhou286/p/16033731.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有