原博客:http://blog.csdn.net/weiwangchao_/article/details/7225338

Linux环境下的TCP Keepalive参数设置

  为什么说是系统默认值的呢?因为有这样几个值,我们并没有手动设置,是采用的系统默认值。即,

  1. 多长时间发送一次保活心跳?
  2. 如果没有返回,多长时间再重试发送?
  3. 重试几次为失败?

      如果是Linux操作系统,这三个值分别为

    1. # cat /proc/sys/net/ipv4/tcp_keepalive_time
    2. 7200
    3. # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
    4. 75
    5. # cat /proc/sys/net/ipv4/tcp_keepalive_probes
    6. 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保活相关推荐

  1. Linux下Tcp保活时间默认多少,C/C++网络编程中的TCP保活

    在默认的情况下,TCP连接是没有保活的心跳的.这就是说,当一个TCP的socket,客户端与服务端谁也不发送数据,会一直保持着连接.这其中如果有一方异常掉线,另一端永远也不可能知道.这对于一些服务型的 ...

  2. 用java网络编程中的TCP方式上传文本文件及出现的小问题

    自己今天刚学java网络编程中的TCP传输,要用TCP传输文件时,自己也是遇到了一些问题,抽空把它整理了一下,供自己以后参考使用. 首先在这个程序中,我用一个客户端,一个服务端,从客户端上传一个文本文 ...

  3. Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正

    在Python核心编程(第3版)第2章网络编程中, 关于tcp/udp服务器和客户端实现代码的运行会出现 ['str' does not support the buffer interface]之类 ...

  4. 关于网络编程中MTU、TCP、UDP优化配置的一些总结

    首先要看TCP/IP协议,涉及到四层:链路层,网络层,传输层,应用层.  其中以太网(Ethernet)的数据帧在链路层 IP包在网络层 TCP或UDP包在传输层 TCP或UDP中的数据(Data)在 ...

  5. 网络编程中的关键问题总结

    网络编程中的关键问题总结 总结下网络编程中关键的细节问题,包含连接建立.连接断开.消息到达.发送消息等等: 连接建立 包括服务端接受 (accept) 新连接和客户端成功发起 (connect) 连接 ...

  6. 网络编程中BIO和NIO的区别

    网络编程中BIO和NIO的区别 先上结论 BIO中,每个请求因为要阻塞直到结果返回,所以比较好的解决是每个请求都需要一个线程来处理,但是线程又是他的制约条件. NIO中,每个请求进来都会绑定到一个ch ...

  7. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  8. Unix 网络编程(四)- 典型TCP客服服务器程序开发实例及基本套接字API介绍

    转载:http://blog.csdn.net/michael_kong_nju/article/details/43457393 写在开头: 在上一节中我们学习了一些基础的用来支持网络编程的API, ...

  9. TCP/IP网络编程之基于TCP的服务端/客户端(二)

    回声客户端问题 上一章TCP/IP网络编程之基于TCP的服务端/客户端(一)中,我们解释了回声客户端所存在的问题,那么单单是客户端的问题,服务端没有任何问题?是的,服务端没有问题,现在先让我们回顾下服 ...

最新文章

  1. 过滤Linux下不同大小的文件,linux查找当前目录下 M/G 大小的文件,删除Linux下指定大小的文件
  2. sqluldr2支持mysql吗_Oracle SQLULDR2 以及 SQLLDR 进行导入导出的功能说明
  3. zcmu1209(dfs)
  4. Meta分析如何进行敏感性分析
  5. java中会存在内存泄漏吗,请简单描述
  6. 商业认知,新的一年开始了
  7. 微软开放Windows Phone 7中文开发中心
  8. xdcms_3.0.1 | 代码审计
  9. python爬大众点评手机号_python抓取大众点评商户信息
  10. f1c100s 调试问题汇总
  11. php 打印机样式自动对齐,虚拟打印机怎么快速设置视图样式
  12. 计算机技术在生物学中的应用鲁东大学,项目学习在高中生物学教学中的应用研究...
  13. hdmi接口有什么用_当贝投影仪HDMI(ARC)接口是什么意思?
  14. shell用for循环编辑显示形状格式(99乘法表,三角,梯形,平行四边形,菱形等)
  15. 四川大学计算机博士申请考核条件,四川大学2020年博士招生章程发布!招1650人!...
  16. 单片机 stm32 差分升级 增量升级算法源码
  17. java JScrollPane设置大小宽高
  18. 利用机器学习实施网络犯罪 6种有效途径触目惊心
  19. GNU Radio 实数与复数信号分析
  20. After Effects Premiere 教程收集

热门文章

  1. 在阿里,我们如何管理代码分支?
  2. 别再说PHP已死了,它活得好着呢
  3. 结合传统与数字技术,构建逼真的机械设计
  4. 3GU仙果游戏达成三地技术引擎战略合作联盟
  5. pmp每日三题(2022年3月15日)
  6. 第一章 SDN介绍 (附件2)【SDNNFV基础、云计算】
  7. 常见Java面试题之静态变量和实例变量的区别
  8. 创建一个dynamics 365 CRM online plugin (四) - PreValidation
  9. [转帖]TLS 版本问题
  10. ES6之路第九篇:Set和Map数据结构