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

在Linux中使用 epoll 处理TCP连接断开问题

在Linux中使用 epoll 处理TCP连接时,默认情况下无法直接检测到网线断开这类物理链路故障。

这是因为TCP协议栈的工作机制导致的。当网线断开后,本地TCP协议栈并不能立刻感知到连接已经不可用。在底层网络设备(如网卡)没有向TCP协议栈反馈链路故障的情况下,TCP连接会处于一种看起来仍然“正常”的状态,实际上数据已经无法传输了。

如果要检测这种情况,可以启用TCP的 Keep - Alive 机制。 Keep - Alive 是一种在TCP连接上定期发送探测包的机制。通过设置 SO_KEEPALIVE 套接字选项,可以让内核定期发送探测包来检查连接是否还存活。如果在一段时间内没有收到对方的响应,就可以认为连接已经断开。

示例代码(设置 SO_KEEPALIVE )如下:

int keepAlive = 1;
int keepIdle = 60;
int keepInterval = 5;
int keepCount = 3;
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &keepAlive, sizeof(keepAlive));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPIDLE, &keepIdle, sizeof(keepIdle));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPINTVL, &keepInterval, sizeof(keepInterval));
setsockopt(sockfd, IPPROTO_TCP, TCP_KEEPCNT, &keepCount, sizeof(keepCount));

在上述代码中, sockfd 是套接字描述符。首先开启 SO_KEEPALIVE 选项,然后设置了 TCP_KEEPIDLE (连接空闲多久后开始发送探测包)、 TCP_KEEPINTVL (探测包发送间隔)和 TCP_KEEPCNT (探测失败多少次后认为连接断开)这几个和 Keep - Alive 相关的参数。

这样,当网线断开后,经过一段时间的探测,就可以通过 epoll 检测到连接断开事件(例如 EPOLLERR 或者 EPOLLHUP )。


http://www.kler.cn/a/404382.html

相关文章:

  • H.264/H.265播放器EasyPlayer.js视频流媒体播放器关于websocket1006的异常断连
  • Swift 数组
  • 内存(RAM)详细介绍
  • 用 React18 构建Tic-Tac-Toe(井字棋)游戏
  • 使⽤MATLAB进⾏⽬标检测
  • Linux 中的 zoxide 命令详解与示例
  • Keil+VSCode优化开发体验
  • IOS证书获取(证书profile文件,p12私钥证书,证书私钥密码,Bundle ID)
  • 使用OkHttp进行HTTPS请求的Kotlin实现
  • 物理学:第一性原理
  • 【C语言】遗传算法matlab程序
  • Android 使用Retrofit 以纯二进制文件流上传文件
  • 微信小程序登录注册页面设计(小程序项目)
  • 【python】Python 虚拟环境的常用命令
  • 基于Multisim的汽车尾灯控制电路设计与仿真
  • 01-spring security认证笔记
  • 鸿蒙UI开发与部分布局
  • 城电科技|太阳能智能座椅对零碳园区建设有什么意义?
  • Kafka 工作流程解析:从 Broker 工作原理、节点的服役、退役、副本的生成到数据存储与读写优化
  • oracle数据恢复—通过拼接数据库碎片的方式恢复Oracle数据的案例
  • Qt在designer设计师界面使用QSplitter
  • 如何配置多個子功能變數名稱共用同一IP地址?
  • ubuntu dpkg 删除安装包
  • Kafka 消费者全面解析:原理、消费者 API 与Offset 位移
  • Xcode 项目内 OC 混编 Python,调用 Python 函数,并获取返回值(基于 python 的 c函数库)
  • 鸿蒙NEXT开发案例:血型遗传计算