epoll检测对端关闭
在对系统问题进行排查时,我发现了一个奇怪的现象:明明是对方断开请求,系统却报告一个查询失败的错误,但从用户角度来看请求的结果正常返回,没有任何问题。
对这个现象深入分析后发现,这是一个基于 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检测对端关闭相关推荐
- 【数据科学项目02】:NLP应用之垃圾短信/邮件检测(端到端的项目)
垃圾短信检测(端到端的项目) 我们都听说过一个流行词--"数据科学".我们大多数人都对"它是什么?我可以成为数据分析师或数据科学家吗?我需要什么技能?并不是很了解.例如: ...
- OCR论文综述(含文字识别、文本检测、端到端和数据集合)
OCR综述概览 主要分为四个部分 文字识别.文本检测.端到端文字识别和数据集的介绍 1. 文字识别 指标为f1-score Conf. Net Title SVT IIIT5K ICDAR13 TPA ...
- 检测PC端和移动端的方法总结(转)
正在苦逼的实习中,昨天公司让做一个页面,涉及到检测终端的问题,如果是手机设备,就跳转到指定的网页上,以前写响应式布局只要用@media screen来实现布局的差异化适应,但是现在不仅仅是布局,还要针 ...
- 检测PC端和移动端的方法总结
(今天在做一个小插件的时候,涉及到检测终端的问题,首先想到的是方法一和比较复杂方法二,后来在网上一搜,发现了这篇总结,又学到了新知识.) 方法一.还是用@media screen 思路:css使用媒体 ...
- epoll socket 服务端中read和write的返回值讨论
2019独角兽企业重金招聘Python工程师标准>>> 先贴一段代码,代码很简单要看过epoll如何使用,都应该能看懂. 这是服务端程序: #include <sys/sock ...
- socket编程 -- epoll模型服务端/客户端通信的实现
https://blog.csdn.net/y396397735/article/details/50680359 本例实现如下功能: 支持多客户端与一个服务端进行通信,客户端给服务端发送字符串数据, ...
- 基于激光雷达点云的3D目标检测算法—端到端多视图融合
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨Rubicon007@知乎 来源丨https://zhuanlan.zhihu.com/p/44 ...
- 服务端关闭session的重要性
原因如下: 如果你的站点是一个每日请求上百万级规模的接口服务, 每一次请求(这里应该是没有携带cookie的请求)都会在服务端产生一个session会话,也就是一个小文件. 一般而言,php的sess ...
- 检测移动端内存敏感数据方法(安卓)
一.背景: 有时因为手机端应用程序备案的需求,需要将手机内存中存储的应用敏感数据进行脱敏或加密处理,我们再验证是否符合要求时,需要通过工具和技术去测试. 二.测试步骤: 1.PC端上安装android ...
最新文章
- js取一定范围内的随机整数
- sqlu8多阶级层次bom_男性比女性多3164万:性别比例失衡,为何还有那么多剩女?...
- hdu 2795 公告板 (单点最值)
- PowerDesigner 教程篇 - 概念数据模型
- Python语言编程之正则表达式模式
- 如何把复杂单体应用快速迁移到微服务
- java geom_java.awt.geom 类 Area - Java 中文参考手册
- 生命周期结束,Spring Boot 1.x退役
- java通过url获取网页内容_Java语言通过URL读取网页数据并保存到本地文件(代码实例)...
- Unable to compile class for JSP异常
- 第六届蓝桥杯试题c/c++B组5
- Redis基础知识 之——发布/订阅
- 模2运算_模二除法和CRC循环冗余校验
- 超好用的浏览器兼容性测试工具,赶紧收藏!
- linux修改证书通用名,如何在Linux上创建自己的通配符证书?
- python运维是做什么的_Python运维工程师主要干什么?
- 第2台计算机的英文简写是,又一IP古装权谋剧来了!那么IP到底是哪两个英文的缩写?...
- V语言04语句表达式
- html5如何设置视频为静音,html5中设置或返回音频/视频是否应该被静音的属性muted-...
- 海康威视人脸识别门禁系统对接
热门文章
- JAVA C~K的班级
- 2021年团体程序设计天梯赛-总决赛题解
- Web前端技术 Web学习资料 Web学习路线 Web入门宝典(不断更新中)
- KEPServerEX助力能源巨擎实现工业4.0
- ben we_老WE成立手游战队!2020LOL冬季转会汇总:截止11月17日(每日更新)
- 推荐给比较好用FF插件
- Flutter syncfusion_flutter_charts 饼图PieSeries使用
- redis官方下载安装(Windows64位)
- Linux:安装 telnet 命令
- 涨知识!细数银行卡三要素 API 的 N 种验证方法