出处:http://blog.csdn.net/embedded_sky/article/details/42077321

对于TCP长连接保活是十分必要的,原因如下:

1、系统多在OA网和外网间有防火墙隔离,很多防火墙对一段时间内没有报文活动的socket会自动关闭。

2、对于非正常断开的连接系统并不能侦测到,比如防火墙关闭端口、网线被拔掉、电脑突然奔掉、未关闭应用程序直接关机(服务端无法释放资源)。

(调用close(fd)为正常断开,连接对端可以侦测到)

TCP长连接保持的两种办法:

1) 应用层面的心跳机制

自定义心跳消息头.,一般客户端主动发送到服务端,服务器接收后进行回应(也可以不回应),以便能够侦测连接是否异常断开。

2) TCP协议自带的保活功能

通过设置TCP keepalive的属性,打开socket的keepalive属性,并设置发送底层心跳包的时间间隔。TCP/IP五层网络模型,我们调用socket等接口是应用层的函数,TCP keepalive是在底层定时发送心跳报文,服务器端接收到底层的心跳报文直接丢弃,不关心其内容。

使用TCP keepalive来保持长连接状态显然要舒服一些,直接调用系统的API即可实现,对于系统而言负担也更轻(相对第一种办法)。

以下是windows下TCP keepalive设置的函数:

/*@author super bert 2014-12-16*//*socket TCP保持长连接函数*/int socket_tcp_alive(int socket){int ret = 0;int keep_alive = 1;ret = setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE, (char*)&keep_alive, sizeof(keep_alive));if (ret == SOCKET_ERROR){printf("setsockopt failed: %d \n", WSAGetLastError());return -1;}struct tcp_keepalive in_keep_alive = {0};unsigned long ul_in_len = sizeof(struct tcp_keepalive);struct tcp_keepalive out_keep_alive = {0};unsigned long ul_out_len = sizeof(struct tcp_keepalive);unsigned long ul_bytes_return = 0;in_keep_alive.onoff = 1; /*打开keepalive*/in_keep_alive.keepaliveinterval = 5000; /*发送keepalive心跳时间间隔-单位为毫秒*/in_keep_alive.keepalivetime = 1000; /*多长时间没有报文开始发送keepalive心跳包-单位为毫秒*/ret = WSAIoctl(socket, SIO_KEEPALIVE_VALS, (LPVOID)&in_keep_alive, ul_in_len,(LPVOID)&out_keep_alive, ul_out_len, &ul_bytes_return, NULL, NULL);if (ret == SOCKET_ERROR){printf("WSAIoctl failed: %d \n", WSAGetLastError());return -1;}return 0;}

需要#include <mstcpip.h>头文件。

TCP长连接保持连接状态TCP keepalive设置相关推荐

  1. TCP长连接和Keepalive详解

    http://blog.csdn.net/huangjin0507/article/details/52396580 TCP协议中有长连接和短连接之分.短连接在数据包发送完成后就会自己断开,长连接在发 ...

  2. 理解TCP长连接(Keepalive)

    TCP Keepalive的起源 TCP协议中有长连接和短连接之分.短连接环境下,数据交互完毕后,主动释放连接: 长连接的环境下,进行一次数据交互后,很长一段时间内无数据交互时,客户端可能意外断电.死 ...

  3. 关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题。涉及tcp连接异常。

    关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题.涉及tcp连接异常. 参考文章: (1)关于心跳ajax请求pending状态(被挂起),stalled时间过长的问题. ...

  4. 面试官问:大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?怎么处理?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 几个方面: 问题描述:什么现象?什么影响? 问题分析 解决 ...

  5. 大量的 TIME_WAIT 状态 TCP 连接,对业务有什么影响?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | ningg.top/computer-basi ...

  6. 应用服务器与数据库之间是长连接,要接收多个 tcp 长连接不断发送的数据并存储,哪些数据库或数据存储方案比较合适?...

    在服务器建立服务端,与多个 tcp 连接保持长连接,服务端会根据客户端发送的 token 验证确定是否保持长连接建立"session"缓存, 在某个状态开启时(我称为存储状态),要 ...

  7. tcp长连接和保活时间

    tcp长连接和保活时间 TCP协议中有长连接和短连接之分.短连接在数据包发送完成后就会自己断开,长连接在发包完毕后,会在一定的时间内保持连接,即我们通常所说的Keepalive(存活定时器)功能.   ...

  8. 网络:tcp长连接与短连接

    当网络通信采用tcp协议时,在真正的读写操作之前,sever与client之间必须建立一个连接,当读写操作完成之后,对方不再需要这个连接时他们可以释放这个链接,连接的连接需要三次握手,释放需要四次握手 ...

  9. TCP长连接及连接管理

    TCP 传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的.可靠的.基于字节流的传输层通信协议. TCP生命周期分为三个阶段: 建立连接 传输数据 关闭 ...

最新文章

  1. python基础框架_Python基础框架和工具-阿里云开发者社区
  2. CQOI2019(十二省联考)游记
  3. Charles是Mac的Fiddler抓包工具
  4. trust cv的含义
  5. python会取代前端吗_大家说,python在不远的将来,会不会把java替代,为什么?
  6. dns服务期搭建使用_DNS添加反向查找区域
  7. java里面的string类型,java中的String类型(不知道理解的好不,请教大神)
  8. 铺铜规则在哪设定_干货丨PCB layout结合生产设计必须遵循这六大规则!
  9. 交叉验证和超参数调整:如何优化你的机器学习模型
  10. Python进制转换
  11. cleanmymac4.12最新版下载安装教程
  12. 巨杉数据库兼容mysql_SequoiaDB 巨杉数据库
  13. 东方博宜OJ 1863 - 【入门】特殊的数字四十
  14. OpenGL 纹理基础与索引
  15. linux关闭后台所有jinch,Centos查看端口占用情况和开启端口命令
  16. Elasticsearch7.17 四 : ElasticSearch集群架构
  17. 电机与拖动 - 8 直流电机的电力拖动
  18. 数字逻辑电路——原码,反码,补码
  19. T 字头 大型国际新能源公司 急聘 待遇优厚
  20. 06、SQL执行时间抖动

热门文章

  1. 前端必备14款业界受欢迎的富文本编辑器
  2. 移动端canvas出现锯齿和文字模糊问题
  3. 石墨烯新用途被发现,可用于检测神经类疾病
  4. Task2-爬虫-正则学习与实践(爬取天猫商品名称价格)
  5. php r n 不换行,php r n 不换行怎么办
  6. JAVA学习日记《一》
  7. iframe的contentWindow属性
  8. python 测量单位的转换和温度单位的转换
  9. # 02 初入大学, 男人之间的告别
  10. jsignature 中文开发手册