C/C++网络编程中的TCP保活
原博客:http://blog.csdn.net/weiwangchao_/article/details/7225338
Linux环境下的TCP Keepalive参数设置
为什么说是系统默认值的呢?因为有这样几个值,我们并没有手动设置,是采用的系统默认值。即,
- 多长时间发送一次保活心跳?
- 如果没有返回,多长时间再重试发送?
- 重试几次为失败?
如果是Linux操作系统,这三个值分别为
- # cat /proc/sys/net/ipv4/tcp_keepalive_time
- 7200
- # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
- 75
- # cat /proc/sys/net/ipv4/tcp_keepalive_probes
- 9
这就是说,在Linux系统下,如果对于TCP的socket启用了Keepalive选项,则会在7200秒(即两个小时)没有数据后,发起KEEPALIVE报文。如果没有回应,则会在75秒后再次重试。如果重试9次均失败,则认定连接已经失效。TCP的读取操作,将返回0。
这对于我们大多数应用来说,前两个时间值都有点太长了。
我们可以通过重设上面三个值,来使得操作系统上运行的所有启用了Keepalive选项的TCP的socket的行为更改。
我们也可以只针对我们自己创建的socket,重设这三个值。它们分别对应TCP_KEEPIDLE、TCP_KEEPINTL和TCP_KEEPCNT的选项值,同样可以使用setsockopt进行设置。
1 #include <stdlib.h> 2 #include <fcntl.h> 3 #include <errno.h> 4 #include <sys/socket.h> 5 #include <netinet/tcp.h> 6 #include <netinet/in.h> 7 #include <netdb.h> 8 #include <arpa/inet.h> 9 10 int 11 socket_set_keepalive (int fd) 12 { 13 int ret, error, flag, alive, idle, cnt, intv; 14 15 /* Set: use keepalive on fd */ 16 alive = 1; 17 if (setsockopt 18 (fd, SOL_SOCKET, SO_KEEPALIVE, &alive, 19 sizeof alive) != 0) 20 { 21 log_warn ("Set keepalive error: %s.\n", strerror (errno)); 22 return -1; 23 } 24 25 /* 10秒钟无数据,触发保活机制,发送保活包 */ 26 idle = 10; 27 if (setsockopt (fd, SOL_TCP, TCP_KEEPIDLE, &idle, sizeof idle) != 0) 28 { 29 log_warn ("Set keepalive idle error: %s.\n", strerror (errno)); 30 return -1; 31 } 32 33 /* 如果没有收到回应,则5秒钟后重发保活包 */ 34 intv = 5; 35 if (setsockopt (fd, SOL_TCP, TCP_KEEPINTVL, &intv, sizeof intv) != 0) 36 { 37 log_warn ("Set keepalive intv error: %s.\n", strerror (errno)); 38 return -1; 39 } 40 41 /* 连续3次没收到保活包,视为连接失效 */ 42 cnt = 3; 43 if (setsockopt (fd, SOL_TCP, TCP_KEEPCNT, &cnt, sizeof cnt) != 0) 44 { 45 log_warn ("Set keepalive cnt error: %s.\n", strerror (errno)); 46 return -1; 47 } 48 49 return 0; 50 }
c++例子
转载于:https://www.cnblogs.com/cdyboke/p/6565601.html
C/C++网络编程中的TCP保活相关推荐
- Linux下Tcp保活时间默认多少,C/C++网络编程中的TCP保活
在默认的情况下,TCP连接是没有保活的心跳的.这就是说,当一个TCP的socket,客户端与服务端谁也不发送数据,会一直保持着连接.这其中如果有一方异常掉线,另一端永远也不可能知道.这对于一些服务型的 ...
- 用java网络编程中的TCP方式上传文本文件及出现的小问题
自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...
- Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正
在Python核心编程(第3版)第2章网络编程中, 关于tcp/udp服务器和客户端实现代码的运行会出现 ['str' does not support the buffer interface]之类 ...
- 关于网络编程中MTU、TCP、UDP优化配置的一些总结
首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层. 其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...
- 网络编程中的关键问题总结
网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...
- 网络编程中BIO和NIO的区别
网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...
- Linux网络编程---详解TCP
Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...
- Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍
转载:http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API, ...
- TCP/IP网络编程之基于TCP的服务端/客户端(二)
回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...
最新文章
- 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件
- sqluldr2支持mysql吗_Oracle SQLULDR2 以及 SQLLDR 进行导入导出的功能说明
- zcmu1209(dfs)
- Meta分析如何进行敏感性分析
- java中会存在内存泄漏吗,请简单描述
- 商业认知,新的一年开始了
- 微软开放Windows Phone 7中文开发中心
- xdcms_3.0.1 | 代码审计
- python爬大众点评手机号_python抓取大众点评商户信息
- f1c100s 调试问题汇总
- php 打印机样式自动对齐,虚拟打印机怎么快速设置视图样式
- 计算机技术在生物学中的应用鲁东大学,项目学习在高中生物学教学中的应用研究...
- hdmi接口有什么用_当贝投影仪HDMI(ARC)接口是什么意思?
- shell用for循环编辑显示形状格式(99乘法表,三角,梯形,平行四边形,菱形等)
- 四川大学计算机博士申请考核条件,四川大学2020年博士招生章程发布!招1650人!...
- 单片机 stm32 差分升级 增量升级算法源码
- java JScrollPane设置大小宽高
- 利用机器学习实施网络犯罪 6种有效途径触目惊心
- GNU Radio 实数与复数信号分析
- After Effects Premiere 教程收集