https://www.csdn.net/gather_2d/NtzaMg1sMTktYmxvZwO0O0OO0O0O.html 参考文件

心跳包机制

跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
其实,要判定掉线,只需要send或者recv一下,如果结果为零,则为掉线。但是,在长连接下,有可能很长一段时间都没有数据往来。理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。更要命的是,有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。在这个时候,就需要我们的心跳包了,用于维持长连接,保活。
在获知了断线之后,服务器逻辑可能需要做一些事情,比如断线后的数据清理呀,重新连接呀……当然,这个自然是要由逻辑层根据需求去做了。
总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。

心跳检测步骤:

1 客户端每隔一个时间间隔发生一个探测包给服务器
2 客户端发包时启动一个超时定时器
3 服务器端接收到检测包,应该回应一个包
4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了

具体实现:
这里用到了 C++自带的 thread库
以下为简单实现的主要部分代码(开个线程不断的发送探测包,设定间隔多长时间一个)

#include <thread>
using std::thread;//单开一个线程去不断地发探测包
thread heartTh = new thread(SocketThread::send_heart(线程执行调用的方法),(void*)this(该方法的参数));
heartTh ->detach();//在h文件中为静态方法
void SocketThread::send_heart(void* arg)
{//该类SocketThread* client = (SocketThread*)arg;while (true){Sleep(3000);   //定时3秒  此处的单位为毫秒string tempdata = "";   //空包int result = client->SendData(tempdata);if (result<0) //result>0是发送成功的返回码  小于零就是发送失败{MessageBox(NULL, "Socket服务端已关闭!!!", "提示", MB_OK|MB_SYSTEMMODAL);break;}Sleep(5000);    //定时3秒  此处的单位为毫秒}
}int SocketThread::SendData(string data)
{int result = send(s_server, data.c_str(), data.length(), 0);return result;
}

注:此篇是基于Socket实现链接的基础上进行心跳包的发送

C++ Socket心跳包机制(Windows环境下)相关推荐

  1. Socket心跳包机制

    心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一 ...

  2. Socket心跳包机制 .

    心跳包的发送,通常有两种技术 方法1:应用层自己实现的心跳包 由应用程序自己发送心跳包来检测连接是否正常,大致的方法是:服务器在一个 Timer事件中定时 向客户端发送一个短小精悍的数据包,然后启动一 ...

  3. Socket心跳包机制总结

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

  4. java udp心跳机制,Socket心跳包机制总结

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

  5. TCP socket心跳包示例程序

    TCP socket心跳包示例程序_xqhrs232的专栏-CSDN博客_setsockopt 心跳包 原文地址::TCP socket心跳包示例程序_神奕的专栏-CSDN博客_tcp心跳包 相关文章 ...

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

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

  7. 【Java 网络编程】客户端 Socket 配置 ( 超时时间 | 端口复用 | Nagle 算法 | 心跳包机制 | 连接关闭机制 | 缓冲区大小 | 性能权重设置 | 紧急数据设置 )

    文章目录 I 设置读取超时时间 II Socket 复用绑定端口设置 III 开启 Nagle 算法 ( 沾包 ) IV 心跳包机制 V 连接关闭处理 VI Socket 紧急数据内敛设置 VII S ...

  8. windows环境下C语言socket编程

    最近由于实验需要,要求写一个c程序与java程序通信的软件,为了测试首先写了一个windows环境下c语言的socket(tcp)通信程序. 首先socket通信的步骤:    图一     sock ...

  9. 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通信

    http://blog.csdn.net/whuancai/article/details/11994341 如何在Windows环境下的VS中安装使用Google Protobuf完成SOCKET通 ...

最新文章

  1. python3报错处理:UnicodeEncodeError: ‘ascii‘ codec can‘t encode characters in position 0-1
  2. Kotlin 越来越牛逼了!学Java都我想转了!
  3. Android香露刀之SeekBar之双管齐下
  4. java中的原子操作_[Java并发系列] 2.Java中的原子操作类
  5. mysql怎么查询两页数据_mysql分页查询踩坑报告
  6. 自动控制原理6.3---串联校正
  7. 使用无线投屏软件将手机和电脑画面同步
  8. 型钢截面特性_工字钢与H型钢有什么区别,为何会有两种钢型结构?
  9. 利用Matlab绘制梯度图、散度图、旋度图
  10. 技术主管和技术总监的区别_技术主管–责任圈
  11. VMware虚拟机全屏状态下如何快速切换回原主机界面
  12. 第二十九篇 -- 学习第五十六天打卡20190826
  13. 给老徐的书《软件自动化测试实战解析-基于Python3》写的序
  14. 北航os实验lab2笔记
  15. 方舟生存显示都是外国服务器,方舟生存进化:在新服的国人,都是如何跟外国人交流的?...
  16. 【戒焦戒躁,can win】Linux--IO缓冲区
  17. linux系统英语词汇大全,linux系统中常命令和英语词汇.docx
  18. 高博课程第三次作业之轨迹的描绘
  19. 我最有用的IntelliJ IDEA键盘快捷键
  20. 咸鱼ZTMR实例—寻迹模块

热门文章

  1. 优酷自动上传软件,百度霸屏轻松到
  2. RS-232/RS-485/RS-422通信协议介绍
  3. 产品助理实习day1
  4. 计算机应用基础18春在线作业2,东师计算机应用基础18——春在线作业2.docx
  5. java毕业设计 springboot旅游网站景区景点购票系统 springboot毕业设计题目课题选题 springboot毕业设计项目作品源码(1)开题报告
  6. Jarvis OJ - ALL CHALLENGS
  7. hisi3518ev200移植MT7601
  8. 了解Portscan扫描器
  9. (附源码)springboot晋韵戏剧点播网站设计 毕业设计112304
  10. 雅虎收购战的中国表情