TCP/IP协议分为4层,分别为应用层、传输层、网络层、数据链路层,TCP协议在TCP/IP协议族的传输层,它提供一种面向连接的、可靠的字节流服务,服务器和客户端交换数据之前必须先建立一个连接,在此基础之上双方进行通信。但实际中会存在各种问题导致掉线(如有的防火墙会关闭长时间没有数据交换的网络、中间路由器断掉等),对于TCP长连接而言,服务器和客户端在很长一段时间内可能不会进行数据交互,但客户端会随时上传数据,因此该连接必须保持。那么如何检测连接的通断情况呢?本文提供两种思路方法,希望还有其他方法的朋友提出来分享交流。

1、 TCP机制本身提供了一种方法——keepalive机制,在网络空闲一长段时间后底层发出报文,若网络通畅,会收到对端回复的报文,则说明网络通畅,则继续等待空闲一长段时间再发报文,若未收到对端报文则说明网络对端掉线,则每隔一小段时间发送报文,若几次都没有收到对端的报文,则说明对端彻底掉线,本地应用层recv()函数会返回0,则将该套接字关闭。该机制在TCP/IP协议的传输层实现,可以通过应用层设置keepalive的相关参数,代码如下。该方法适合并发服务器检测网络通畅性问题。

int SetTcpKeepalive(int fd, unsigned int start, unsigned int interval, unsigned int count)
{     int keepAlive = 1;     if (fd < 0 || start < 0 || interval < 0 || count < 0)return -1; //启用心跳机制,如果您想关闭,将keepAlive置零即可     if(setsockopt(fd,SOL_SOCKET,SO_KEEPALIVE,(void*)&keepAlive,sizeof(keepAlive)) == -1)     {     perror("setsockopt");     return -1;     }     //启用心跳机制开始到首次心跳侦测包发送之间的空闲时间     if(setsockopt(fd,SOL_TCP,TCP_KEEPIDLE,(void *)&start,sizeof(start)) == -1)     {     perror("setsockopt");     return -1;     }     //两次心跳侦测包之间的间隔时间     if(setsockopt(fd,SOL_TCP,TCP_KEEPINTVL,(void *)&interval,sizeof(interval)) == -1)     {     perror("setsockopt");     return -1;     }     //探测次数,即将几次探测失败判定为TCP断开     if(setsockopt(fd,SOL_TCP,TCP_KEEPCNT,(void *)&count,sizeof(count)) == -1)     {     perror("setsockopt");     return -1;     }     return 0;
}

2、应用层发送心跳包:每隔一段时间向对端发送一个较小的数据包,通知对方自己在线,并传输一些可能必要的数据(如告诉服务器该数据包为心跳包),并且定时检测对端返回的数据,若连续几次在规定时间内均未收到回复,则判断对端掉线,可以做下一步处理。该方法适合用于客户端处理,在应用层开一个线程发送心跳包,本例中只有发送数据包,未做接收数据处理。数据报文如下:

typedef  char  Data;typedef enum {HEART = 0,   //心跳报文头部MSG          //数据报文头部
}Type;typedef struct datapack{Type  type;    //若为心跳报文,buf和len为0Data  buf[32];int   len;
}DataPack;

处理心跳报文的线程函数如下:


void *HeartBeat(void *argc)
{int ret = 0;int cunt = 0;int i = 0;DataPack heart_data;bzero(&heart_data, sizeof(heart_data));heart_data.type = HEART;heart_data.len = 0;printf("start send heartbeat data \n");cunt = 0;while(1){ret = send(cli_fd, &heart_data, sizeof(heart_data), 0);if(ret < 0){cunt ++;if(errno == EPIPE){//服务器关闭,发送数据导致管道破裂//处理流程}if(cunt > 5){printf("server is offline \n");printf("the client is going down \n");exit(0);}close(cli_fd);}delay(3000);}
}

在服务器崩溃以后客户端还调用send()函数会导致管道破裂,该信号的默认处理方式为结束进程, 为了避免进程结束可以调用signal函数忽略掉该信号,如下:

signal(SIGPIPE, SIG_IGN);

本文中若有不足的地方请各位看官提出。

TCP 应用层 心跳包相关推荐

  1. TCP socket心跳包示例程序

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

  2. 心跳检测以及应用层心跳包机制设计

    博主联系方式: QQ:1540984562 微信:wxid_nz49532kbh9u22 QQ交流群:892023501(嵌入式方向) QQ交流群:856398158(后端方向) 目录 心跳检测应用场 ...

  3. 游戏服务器心跳包的作用

    游戏服务器心跳包的作用 服务端为什么需要心跳(保活)机制 TCP-Keepalive-HOWTO 闲说HeartBeat心跳包和TCP协议的KeepAlive机制 Socket心跳包机制 心跳包的作用 ...

  4. tcp连接探测Keepalive和心跳包

    采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...

  5. 闲说HeartBeat心跳包和TCP协议的KeepAlive机制

    很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个数据包,通知服务器自己仍然在线,并传输一些可能必要的数据.使用心跳包的典型协议是IM,比如QQ/MSN/飞信等协议. ...

  6. TCP协议的KeepAlive机制与HeartBeat心跳包

    原文地址:http://www.nowamagic.net/academy/detail/23350382 心跳包 很多应用层协议都有HeartBeat机制,通常是客户端每隔一小段时间向服务器发送一个 ...

  7. TCP连接的心跳包机制

    文章目录 什么是心跳机制 为什么需要心跳机制? 如何及时有效地检测到另一方的非正常断开 TCP的keeplive保活机制 什么是心跳机制 所谓的心跳包就是(探测性的)数据包,之所以叫心跳包是因为:它像 ...

  8. TCP连接探测中的Keepalive和心跳包

    1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...

  9. linux内核协议栈 TCP连接探测中的Keepalive和心跳包使用

    目录 1 TCP保活的必要性 2 导致TCP断连的因素 3 保活的两种方式 3.1 应用层面的心跳机制 3.2 TCP协议自带的保活功能 4 两种方式的优劣性 5 到底选用那种心跳方式? 6 配置 K ...

最新文章

  1. vue-router 在项目中的使用
  2. 13/100. Best Time to Buy and Sell Stock
  3. BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
  4. 《淘宝网开店 SEO 推广 营销 爆款 实战200招》——1.3 网上开店的热门行业有哪些...
  5. virtual关键字的使用(C# 参考)
  6. 思科DHCP不同网段通信
  7. 8086可以用c语言编程吗,[求助]如何将C程序反汇编成8086汇编程序
  8. layui 自定义排序_layui使用心得
  9. oracle qmon,10g QMON Architecture及AQ_TM_PROCESSES
  10. Ubuntu常见错误合集——持续更新
  11. 创新工场李开复:漫延——中国移动互联网的2011年
  12. 德州大学计算机系郭小虎2021,2021美国德州农工大学PhD项目
  13. java之元数据(metadata)
  14. 78岁老人爱上玩乐器硬是学会了吹奏萨克斯
  15. 利用android实现汇率计算器,利用python编写一个汇率计算器
  16. 共享软件作者怎样才能月入万元(一)
  17. 全球及中国雾化铜和铜合金粉末行业产销需求及发展动态分析报告2022-2028年
  18. 欢迎大家关注知识分享公众号
  19. 罗马字母和希腊字母读法(in math)
  20. 网安面试题汇总--持续记录

热门文章

  1. http post 和 get
  2. 学生硬件电路设计经验教训浅谈
  3. Mac开启root用户
  4. 【vue+jsPlumb】实现字段映射(数据映射),通过手动连接创建映射关系
  5. oracle数据库led显示屏,LED大屏幕设置软件
  6. 计算机软件著作权用户手册资料,请问一下计算机软件著作权登记里的使用手册有没有什么要求,可以是大量图片加少量文字吗?我只写了20页- 法律快车法律咨询...
  7. 基于snmp协议监控华为s5720交换机
  8. 非AJAX的CRUD,使用Node.js+Express+ejs的动态技术--图书管理系统之查询操作
  9. 网站安全监控的意义何在?
  10. 桌游“德国心脏病”的python代码实现