19心跳包机制的实现
作者:互联网
一、为什么引入心跳包
常规客户端关闭,服务器端能感知到;
有一种特殊情况,连接断开c/s都感知不到:
拔掉c/s程序的网线; "拔掉网线导致服务器感知不到客户端断开",这个事实,大家一定要知道;那为了应对拔网线,导致不知道对方是否断开了tcp连接这种事,这就是我们引入心跳包机制的原因;超时没有发送来心跳包,那么就会将对端的socket连接close掉,回收资源;这就是心跳包的作用;
其他作用: 检测网络延迟。
tcp本身keepalive机制;因为检测时间不好控制,所以不适合。
二、实际代码
2.1 逻辑处理位置
ps:心跳包本身是作为一个数据包的格式传给服务器的,所以,具体的处理位置就是在业务处理代码上。
对于怎么去接收处理一个数据包的逻辑问题,在前面就已经讲过。这里直接上代码。
2.2 这个近期的最新时间是怎么被利用的
1.首先,是否踢人,和设置心跳包的时间是在配置文件中的。
2.当一个连接进来的时候,那么就把这个连接加入到时间队列中去
std::multimap<time_t, LPSTRUC_MSG_HEADER> m_timerQueuemap; //时间队列
3.创建一个服务处理到期不发心跳包用户的踢出连接的线程
4.线程入口函数ServerTimerQueueMonitorThread
(1)第一步就是把时间队列中最近的时间点取出进行判断(有没有到最近时间)
(2)要是比当前时间小,那么,时间队列中就有大于等于1个的超时(20S)连接,把这些超时连接放入另外一个队列中进行判断,比较的是,时间队列中的时间和当前时间。
(3)当另外一个队列不为空时,那么就放入pSocketObj->procPingTimeOutChecking(tmpmsg,cur_time);进行进行检查(可以说是二次检查)。这个函数是在连接的子类中实现的。比较的是,当前时间和这个连接的ping包时间。
(4)要是这个判断标准成立了,那么就主动关闭套接字。
PS:这里是三个时间,不一样的三个变量存储
2.3一些其他处理
比如说:
客户端主动关闭的套接字,就要将该连接从时间队列中取出出来。
标签:19,网线,队列,时间,心跳,机制,超时,连接 来源: https://www.cnblogs.com/haozhou286/p/16033731.html