epoll为什么不会触发hup

发布于 2022-09-01 06:18:00 字数 1440 浏览 9 评论 0

一个简单的例子,当我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
            

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

逐鹿 2022-09-08 06:18:00

当对端正常关闭连接时,会同时触发EPOLLIN和EPOLLHUP:

EPOLLIN:0b1
EPOLLOUT:0b100
EPOLLHUP:0b10000

我稍微改动了你的代码打印了event的二进制值,发现当对端关闭连接时,event的二进制值是:event 0b11001,即 EPOLLIN | EPOLLHUP | 1000,这其实与预期是符合的,EPOLLIN和EPOLLHUP确实是同时触发了,但你的处理代码里用的是elif这样的组合,如果两个分支同时满足,是会被跳过的,恰好你的EPOLLIN写在EPOLLHUP前,所以EPOLLHUP完全被忽略掉了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文