在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。

对这个现象深入分析后发现,这是一个基于 epoll 的连接池实现上的问题,或者说是特性 :)

首先解释一下导致这个现象的原因。

在使用 epoll 时,对端正常断开连接(调用 close()),在服务器端会触发一个 epoll 事件。在低于 2.6.17 版本的内核中,这个 epoll 事件一般是 EPOLLIN,即 0x1,代表连接可读。

连接池检测到某个连接发生 EPOLLIN 事件且没有错误后,会认为有请求到来,将连接交给上层进行处理。这样一来,上层尝试在对端已经 close() 的连接上读取请求,只能读到 EOF,会认为发生异常,报告一个错误。

因此在使用 2.6.17 之前版本内核的系统中,我们无法依赖封装 epoll 的底层连接库来实现对对端关闭连接事件的检测,只能通过上层读取数据时进行区分处理。

不过,2.6.17 版本内核中增加了 EPOLLRDHUP 事件,代表对端断开连接,关于添加这个事件的理由可以参见 “[Patch][RFC] epoll and half closed TCP connections”。

在使用 2.6.17 之后版本内核的服务器系统中,对端连接断开触发的 epoll 事件会包含 EPOLLIN | EPOLLRDHUP,即 0x2001。有了这个事件,对端断开连接的异常就可以在底层进行处理了,不用再移交到上层。

重现这个现象的方法很简单,首先 telnet 到 server,然后什么都不做直接退出,查看在不同系统中触发的事件码。

注意,在使用 2.6.17 之前版本内核的系统中,sys/epoll.h 的 EPOLL_EVENTS 枚举类型中是没有 EPOLLRDHUP 事件的,所以带 EPOLLRDHUP 的程序无法编译通过。

epoll检测对端关闭相关推荐

  1. 【数据科学项目02】:NLP应用之垃圾短信/邮件检测(端到端的项目)

    垃圾短信检测(端到端的项目) 我们都听说过一个流行词--"数据科学".我们大多数人都对"它是什么?我可以成为数据分析师或数据科学家吗?我需要什么技能?并不是很了解.例如: ...

  2. OCR论文综述(含文字识别、文本检测、端到端和数据集合)

    OCR综述概览 主要分为四个部分 文字识别.文本检测.端到端文字识别和数据集的介绍 1. 文字识别 指标为f1-score Conf. Net Title SVT IIIT5K ICDAR13 TPA ...

  3. 检测PC端和移动端的方法总结(转)

    正在苦逼的实习中,昨天公司让做一个页面,涉及到检测终端的问题,如果是手机设备,就跳转到指定的网页上,以前写响应式布局只要用@media screen来实现布局的差异化适应,但是现在不仅仅是布局,还要针 ...

  4. 检测PC端和移动端的方法总结

    (今天在做一个小插件的时候,涉及到检测终端的问题,首先想到的是方法一和比较复杂方法二,后来在网上一搜,发现了这篇总结,又学到了新知识.) 方法一.还是用@media screen 思路:css使用媒体 ...

  5. epoll socket 服务端中read和write的返回值讨论

    2019独角兽企业重金招聘Python工程师标准>>> 先贴一段代码,代码很简单要看过epoll如何使用,都应该能看懂. 这是服务端程序: #include <sys/sock ...

  6. socket编程 -- epoll模型服务端/客户端通信的实现

    https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据, ...

  7. 基于激光雷达点云的3D目标检测算法—端到端多视图融合

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Rubicon007@知乎 来源丨https://zhuanlan.zhihu.com/p/44 ...

  8. 服务端关闭session的重要性

    原因如下: 如果你的站点是一个每日请求上百万级规模的接口服务, 每一次请求(这里应该是没有携带cookie的请求)都会在服务端产生一个session会话,也就是一个小文件. 一般而言,php的sess ...

  9. 检测移动端内存敏感数据方法(安卓)

    一.背景: 有时因为手机端应用程序备案的需求,需要将手机内存中存储的应用敏感数据进行脱敏或加密处理,我们再验证是否符合要求时,需要通过工具和技术去测试. 二.测试步骤: 1.PC端上安装android ...

最新文章

  1. js取一定范围内的随机整数
  2. sqlu8多阶级层次bom_男性比女性多3164万:性别比例失衡,为何还有那么多剩女?...
  3. hdu 2795 公告板 (单点最值)
  4. PowerDesigner 教程篇 - 概念数据模型
  5. Python语言编程之正则表达式模式
  6. 如何把复杂单体应用快速迁移到微服务
  7. java geom_java.awt.geom 类 Area - Java 中文参考手册
  8. 生命周期结束,Spring Boot 1.x退役
  9. java通过url获取网页内容_Java语言通过URL读取网页数据并保存到本地文件(代码实例)...
  10. Unable to compile class for JSP异常
  11. 第六届蓝桥杯试题c/c++B组5
  12. Redis基础知识 之——发布/订阅
  13. 模2运算_模二除法和CRC循环冗余校验
  14. 超好用的浏览器兼容性测试工具,赶紧收藏!
  15. linux修改证书通用名,如何在Linux上创建自己的通配符证书?
  16. python运维是做什么的_Python运维工程师主要干什么?
  17. 第2台计算机的英文简写是,又一IP古装权谋剧来了!那么IP到底是哪两个英文的缩写?...
  18. V语言04语句表达式
  19. html5如何设置视频为静音,html5中设置或返回音频/视频是否应该被静音的属性muted-...
  20. 海康威视人脸识别门禁系统对接

热门文章

  1. JAVA C~K的班级
  2. 2021年团体程序设计天梯赛-总决赛题解
  3. Web前端技术 Web学习资料 Web学习路线 Web入门宝典(不断更新中)
  4. KEPServerEX助力能源巨擎实现工业4.0
  5. ben we_老WE成立手游战队!2020LOL冬季转会汇总:截止11月17日(每日更新)
  6. 推荐给比较好用FF插件
  7. Flutter syncfusion_flutter_charts 饼图PieSeries使用
  8. redis官方下载安装(Windows64位)
  9. Linux:安装 telnet 命令
  10. 涨知识!细数银行卡三要素 API 的 N 种验证方法