请问epoll不触发hup是什么问题
一个简单的例子,当我telnet 127.0.0.1 1234后,我关掉打开telnet的那个终端窗口,为什么不会触发event & select.EPOLLHUP。求解。
import socket import select server=socket.socket(socket.AF_INET,socket.SOCK_STREAM) server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server.bind(('0.0.0.0',1234)) server.listen(10) server.setblocking(0) epoll=select.epoll() epoll.register(server.fileno(),select.EPOLLIN) print 'server filno:',server.fileno() try: connections={};requests={};responses={} while True: events=epoll.poll(1) for fileno,event in events: print 'event', event if fileno == server.fileno(): connection,addr=server.accept() connFd=connection.fileno() connection.setblocking(0) epoll.register(connFd,select.EPOLLIN) connections[connFd]=connection elif event & select.EPOLLIN: requests[fileno]=connections[fileno].recv(1024).strip() epoll.modify(fileno,select.EPOLLOUT) elif event & select.EPOLLOUT: connections[fileno].send(requests[fileno]+'\n') epoll.modify(fileno,select.EPOLLIN) elif event & select.EPOLLHUP: print('close') epoll.unregister(fileno) connections[fileno].close() del connections[fileno] finally: pass
当对端正常关闭连接时,会同时触发EPOLLIN和EPOLLHUP:
EPOLLIN:0b1
EPOLLOUT:0b100
EPOLLHUP:0b10000
我稍微改动了你的代码打印了event的二进制值,发现当对端关闭连接时,event的二进制值是:event 0b11001,即 EPOLLIN | EPOLLHUP | 1000,这其实与预期是符合的,EPOLLIN和EPOLLHUP确实是同时触发了,但你的处理代码里用的是elif这样的组合,如果两个分支同时满足,是会被跳过的,恰好你的EPOLLIN写在EPOLLHUP前,所以EPOLLHUP完全被忽略掉了。
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd18852.html
相关文章 Recommend
- • Netbeans 7.0.0.1安装python插件安装后,启动IDE显示不
- • 类似美元$这个符号pyCharm2.0里怎么输入不好用呢
- • 不要每天都kill进程,python消息队列服务退出还有什
- • 想转业学python,请问应该如何规划自己的学习计划
- • Python语言运行GUI程序的工作效率高不高?
- • 一段代码中使用了sqlite有部分不理解的地方,求老
- • Python正则表达式匹配不成功,值为None
- • 求分析django工程目录里找不到导入模块原因
- • 不小心删除了pythonwin,重装之后提示不是有效的
- • python语言中两个不同模块可以互相导入吗?
- • 新手对python default不是很理解它有什么用途
- • type()方法不是python最好的判断变量类型方法吗?
您现在的位置: 玩蛇网首页 > Python问题解答 > 正文内容
我要分享到:
必知PYTHON教程 Must Know PYTHON Tutorials
- • python 解释器
- • python idle
- • python dir函数
- • python 数据类型
- • python type函数
- • python 字符串
- • python 整型数字
- • python 列表
- • python 元组
- • python 字典
- • python 集合
- • python 变量
- • python print
- • python 函数
- • python 类定义
- • python import
- • python help
- • python open
- • python 异常处理
- • python 注释
- • python continue
- • python pass
- • python return
- • python global
- • python assert
- • python if语句
- • python break
- • python for循环
- • python while循环
- • python else/elif
- • lambda匿名函数
必知PYTHON模块 Must Know PYTHON Modules
- • os 模块
- • sys 模块
- • re 正则表达式
- • time 日期时间
- • pickle 持久化
- • random 随机
- • csv 模块
- • logging 日志
- • socket网络通信
- • json模块
- • urlparse 解析URL
- • urllib 模块
- • urllib2 模块
- • robotparser 解析
- • Cookie 模块
- • smtplib 邮件
- • Base64 编码
- • xmlrpclib客户端
- • string 文本
- • Queue 线程安全
- • math数学计算
- • linecache缓存
- • threading多线程
- • sqlite3数据库
- • gzip压缩解压
最新内容 NEWS
- • django app提供pv信息的方法是什么
- • Django项目版本升级如何操作?
- • django较多数据传递如何优雅的呈现
- • django1.7获取参数问题求助
- • Django1.7使用内置comment遇到问题
- • python mysql数据库做insert操作时报_mysql_ex
- • 关于python mysql的duplicate insert机制的疑问
- • pymongo使用insert函数批量插入被中断要怎么
- • Python程序员解决棘手问题的常用库
- • 求助关于restfull api接口几个问题
图文精华 RECOMMEND
-
django1.7获取参数问题求助
-
Python程序员解决棘手问题的常用库
-
求问str()同__str__原理上有什么不同
-
scrapy框架里面用link extractor怎么能
-
python {}.fromkeys创建字典append添加操
-
python3 类型Type str doesn't support th
热点文章 HOT
- 学习Python有什么好的书籍推荐?
- Python匿名函数 Lambda表达式作用
- Python与Java、C、Ruby、PHP等编程语言有什么
- Python 正则中文网页字符串提取问题
- 如何为实时性应用存取经纬度?django my
- 想用python做个客户端,在二维码登录这个地
- 有让IDE可识别Python函数参数类型的方法吗
- Python字符串转换成列表正则疑问