当前位置: 首页 > news >正文

Linux下TCP keepalive心跳设置

  Linux下TCP keepalive属性的表现  2008-03-20 15:28:55

分类: LINUX

tcp是面向连接的,在实际应用中通常都需要检测连接是否还可用.如果不可用,可分为:
a. 连接的对端正常关闭.
b. 连接的对端非正常关闭,这包括对端设备掉电,程序崩溃,网络被中断等.这种情况是不能也无法通知对端的,所以连接会一直存在,浪费国家的资源.


tcp协议栈有个keepalive的属性,可以主动探测socket是否可用,不过这个属性的默认值很大.
全局设置可更改/etc/sysctl.conf,加上:
net.ipv4.tcp_keepalive_intvl = 20
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_time = 60

在程序中设置如下:

 

  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <sys/types.h>
  #include <netinet/tcp.h>

  int keepAlive = 1; // 开启keepalive属性
  int keepIdle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测 
  int keepInterval = 5; // 探测时发包的时间间隔为5 秒
  int keepCount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.

  setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
  setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepIdle, sizeof(keepIdle));
  setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));
  setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount)); 
  


在程序中表现为,当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT.

相关文章:

  • 利用SQL存储过程创建交叉表
  • Program received signal SIGUSR1, User defined signal 1.解决方法
  • 在Linux中创建静态库.a和动态库.so
  • 弹出窗口中修改值数据后,父窗口中加载修改后的数据
  • makefile查找文件是否含某特定字符,若没有才添加;
  • makefile查找文件是否存在,不存在才拷贝;
  • 企业财务报表的分析方法(The analysis of financial statements)
  • c/c++经典面试题
  • 分形艺术 ---- 忘却记忆
  • char和unsigned char--数据类型区别
  • 一个电脑**和黑客的对话(笑死你)
  • Python使用Glob查找文件
  • 关于struts2
  • python 3.8 yolov5 烟火检测配置
  • Simple iptables
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【node学习】协程
  • angular组件开发
  • Hibernate最全面试题
  • JAVA之继承和多态
  • Laravel核心解读--Facades
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • mongo索引构建
  • Vue 动态创建 component
  • Vue实战(四)登录/注册页的实现
  • Vue小说阅读器(仿追书神器)
  • Webpack 4x 之路 ( 四 )
  • 对超线程几个不同角度的解释
  • 反思总结然后整装待发
  • 工作中总结前端开发流程--vue项目
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 码农张的Bug人生 - 见面之礼
  • 前端设计模式
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 提醒我喝水chrome插件开发指南
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​io --- 处理流的核心工具​
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​中南建设2022年半年报“韧”字当头,经营性现金流持续为正​
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #Z2294. 打印树的直径
  • $ git push -u origin master 推送到远程库出错
  • (java)关于Thread的挂起和恢复
  • (二)Linux——Linux常用指令
  • (汇总)os模块以及shutil模块对文件的操作
  • (切换多语言)vantUI+vue-i18n进行国际化配置及新增没有的语言包
  • (四)Linux Shell编程——输入输出重定向
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)Linux+Windows下安装ffmpeg
  • (转)编辑寄语:因为爱心,所以美丽
  • .mysql secret在哪_MYSQL基本操作(上)
  • .net 重复调用webservice_Java RMI 远程调用详解,优劣势说明
  • .NET/C# 检测电脑上安装的 .NET Framework 的版本
  • .netcore 6.0/7.0项目迁移至.netcore 8.0 注意事项