linux下socket连接下的心跳机制

1,在长连接下,有可能很长一段时间都没有数据往来

理论上说,这个连接是一直保持连接的,但是实际情况中,如果中间节点出现什么故障是难以知道的。

有的节点(防火墙)会自动把一定时间之内没有数据交互的连接给断掉。

在这个时候,就需要我们的心跳包了,用于维持长连接,保活

2,心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。


3,下面为封装好的心跳包函数,加入项目中参数设置一下即可

[cpp] view plain copy print?
  1. #include <netinet/tcp.h>    
  2. //参数解释   
  3. //fd:网络连接描述符  
  4. //start:首次心跳侦测包发送之间的空闲时间    
  5.  //interval:两次心跳侦测包之间的间隔时间   
  6. //count:探测次数,即将几次探测失败判定为TCP断开  
  7. int set_tcp_keepAlive(int fd, int start, int interval, int count)     
  8. {     
  9.     int keepAlive = 1;     
  10.     if (fd < 0 || start < 0 || interval < 0 || count < 0) return -1;   //入口参数检查 ,编程的好习惯。  
  11.     //启用心跳机制,如果您想关闭,将keepAlive置零即可     
  12.     if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)     
  13.     {     
  14.         perror("setsockopt");     
  15.         return -1;     
  16.     }     
  17.     //启用心跳机制开始到首次心跳侦测包发送之间的空闲时间     
  18.     if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start)) == -1)     
  19.     {     
  20.         perror("setsockopt");     
  21.         return -1;     
  22.     }     
  23.     //两次心跳侦测包之间的间隔时间     
  24.     if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval)) == -1)     
  25.     {     
  26.         perror("setsockopt");     
  27.         return -1;     
  28.     }     
  29.     //探测次数,即将几次探测失败判定为TCP断开     
  30.     if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count)) == -1)     
  31.     {     
  32.         perror("setsockopt");     
  33.         return -1;     
  34.     }     
  35.     return 0;     
  36. }   
 
将想设置的参数传入该函数,设置成功返回0,否则返回-1。设置成功以后,可以将fd交给select去监听可读可写事件,如果select检测到fd可读且read返回错误(<0),一般就能判定该fd对应的TCP连接已经异常断开,调用close函数将fd关闭即可。


TCP连接非正常断开的检测(KeepAlive探测)

此处的”非正常断开”指TCP连接不是以优雅的方式断开,如网线故障等物理链路的原因,还有突然主机断电等原因

有两种方法可以检测:1.TCP连接双方定时发握手消息 2.利用TCP协议栈中的KeepAlive探测

第二种方法简单可靠,只需对TCP连接两个Socket设定KeepAlive探测。

心跳机制只是做检查,并不能处理

从而得知连接已失效,客户端程序便有机会及时执行清除工作、提醒用户或重新连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/253113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大力智能台灯与飞利浦台灯 智能调光功能体验

目前市面上绝大部分智能台灯几乎都宣称有自动调光功能&#xff0c;即台灯随环境光变化自动调节LED光的亮度&#xff0c;或者台灯在固定环境光下&#xff0c;一旦开启了自动调光模式LED灯将自动调光至一个最适合读写作业的亮度&#xff1b; 下面对比体验了大力台灯T6 和 飞利浦…

php-验证码

<html><body> <h2>用户注册&#xff1a;</h2> <br> <form action"a.php" method"post"> 账 号&#xff1a;<input type"text" name"zh" id""> <br> 密 码&#xff1a;&l…

Linux内核Socket参数调优

可调优的内核变量存在两种主要接口&#xff1a;sysctl命令和/proc文件系统&#xff0c;proc中与进程无关的所有信息都被移植到sysfs中。IPV4协议栈的sysctl参数主要是sysctl.net.core、sysctl.net.ipv4&#xff0c;对应的/proc文件系统是/proc/sys/net/ipv4和/proc/sys/net/cor…

Mango 的组织重构

为了提高敏捷性&#xff0c;企业应将自己划分为一些负责业务战略计划价值中心&#xff0c;承担端到端的责任&#xff0c;并完全获取有关客户需求的信息。企业需要为员工营造可交叉协作的空间&#xff0c;可以学习和使用自组织的改进圈、实践社群&#xff08;CoP&#xff0c;Com…

vue.js单页面应用实例

一&#xff1a;npm的安装由于新版的node.js已经集成了npm的环境&#xff0c;所以只需去官网下载node.js并安装&#xff0c;安装完成后使用cmd检测是否成功。测试node的版本号&#xff1a;node -v测试npm的版本号&#xff1a;npm -v以上提示代表安装成功二&#xff1a;vue.js环境…

大屏拼接控制器的发展历程与现状分析

【中国数字视听网讯】在大屏幕拼接系统中&#xff0c;我们很容易将焦点聚集在拼接单元上&#xff0c;殊不知幕后还有一个英雄在默默的支持&#xff0c;这个英雄就是是拼接控制器。拼接控制器的优劣直接决定着整个大屏幕显示系统效果的好与坏&#xff0c;也决定了整套显示系统的…

AA级与AAA级台灯 重要指标对比

读写作业台灯&#xff0c;按照国家标准&#xff08;GB/T 9473-2017 读写作业台灯性能要求 &#xff09;台灯只有两个等级 即为A级和AA级&#xff1a; 但是大家在各个购物网站挑选台灯尤其是挑选孩子学习用的读写台灯时&#xff0c;会发现很多厂家宣称台 灯为AAA级&#xff0c…

windbg调试相关命令

windbg查找函数:x exe!main*条件断点打印字符&#xff1a;bp 7199a2b0 ".printf \"message:%ma\", poi(esp8);.echo;g"//搜索内存:s -a 0000000000780000 L8000000 "This is a test2"!address,可以查看进程的堆布局&#xff0c;堆属性。!addre…

零基础学python,看完这篇文章,你的python基础就差不多了!干货【1】

2019独角兽企业重金招聘Python工程师标准>>> Python基础语法和面向对象&#xff08;下一篇分享面向对象&#xff09; Python基础语法 1. 认识Python 1.1 Python 简介 Python 的创始人为吉多范罗苏姆&#xff08;Guido van Rossum&#xff09;。 Python 的设计目标&a…

消费类电子认证测试资料清单

消费类电子上市前必须取得相关认证&#xff0c;其中最常见的有3C、SRRC和CTA等强制性认证&#xff0c;还有类似TUV和Rohs等自愿性认证&#xff0c;现将常见认证测试资料清单小结如下&#xff1a; CCC测试认证&#xff1a; 测试项&#xff1a;EMC、安规和随机等。 SRRC核准&am…

SVG 相关整理

1. 中文参考手册&#xff1a; http://www.runoob.com/svg/svg-reference.html SVG HTML5 资源教程 http://www.html5tricks.com/tag/svg/ 2.SVG 入门到精通 http://www.w3cplus.com/blog/tags/411.html 3.SVG开发包整理 http://www.oschina.net/project/tag/420/svg http://www…

液晶拼接控制器

液晶拼接墙系统是由液晶拼接显示单元、液晶拼接支架、液晶拼接控制器器和信号源组合而成的。液晶拼接控制器则是液晶拼接系统的重要组成部分。 液晶拼接控制器一般分为两种&#xff1a;内置嵌入式液晶拼接器、外置液晶拼接控制器。 内置嵌入式液晶拼接器 内置嵌入式液晶拼接器只…

03-类与对象——课后动手动脑

1.早期我们经常这样定义变量 int value100&#xff1b; 前面的示例中这样定义变量 MyClass obj new MyClass(); 这两种方式定义的变量是一样的吗&#xff1f; 这两种方式定义的变量是一样的&#xff0c;因为它们都是类的实例化&#xff0c;只是第一种是一个简便的写法&#xf…

IPython 使用记录

记录使用的一些技巧处理 1 自动重载修改的文件 局部的会话中使用 如果想在当前 ipython 会话中使用&#xff0c;则运行 ipython 后&#xff0c;依次键入下面语句即可 %load_ext autoreload %autoreload 2 全局使用如果想为了懒省事&#xff0c;我希望 IPython 一直会自动重载&a…

有道智能学习灯 初体验

有道词典笔在业内树立了一个标杆&#xff0c;自认为有道出品必须精品&#xff01; 但是今天刚初步体验了一下有道智能学习灯&#xff0c;硬件方面说实话有点意外&#xff0c;猜测这应该不是有道词典 笔团队打造的硬件产品吧。 现在将个人体验感受表格化陈述如下&#xff1a;…

视频处理器

http://baike.baidu.com/link?url9Ql-myLXWgFtt8ItgnYe1suvbqU57tivB8WwTVHqNqGWKNQqgvkQ7uqYrw22I44LO-LCmjQuKAk-SGGWV8di4_

centos忘记root用户的密码

方法&#xff1a; 1.在开机启动的时候快速按键盘上的“E”键 或者“ESC”键&#xff08;如果做不到精准快速可以在启动前一直按着或者不停的按&#xff09;&#xff0c;会进入如下界面。如果你的有多个操作系统就会出现多个内核&#xff0c;就会出现多个选项 2. 选择你忘记密码…

MySql(18)——Linux MySQL主从配置

MySQL 主从配置 Author:xushuyi 参照技术&#xff1a;http://www.cnblogs.com/kevingrace/p/6256603.html 1. 主从数据库 1、主库&#xff1a;192.168.56.100 2、从库&#xff1a;192.168.56.102 3、创建主从数据库一定要保证主从数据库字符集编码的一致性&#xff0c;否则主从…

linux之PHY

一.结构体 1.PHY设备 [cpp]view plaincopy struct phy_device { struct phy_driver *drv; //PHY设备驱动 struct mii_bus *bus; //对应的MII总线 struct device dev; //设备文件 u32 phy_id; //PHY ID enum phy_state state; //PHY状态 …

元器件 失效分析 过程介绍

硬件产品在使用过程中&#xff0c;常常会出现功能失效的情况。排除装配异常的话&#xff0c;功能失效一般是电路可能出现故障&#xff0c;具体可能是某个元器件损坏了。需要研发及时分析定位故障原因及时改善排除故障&#xff0c;尤其是在试产阶段&#xff0c;显得十分重要&…