用于连接套接字的 epoll 事件

Epoll events for connecting sockets

我创建了 epoll 并注册了一些尝试连接到本地主机上关闭端口的非阻塞套接字。为什么 epoll 告诉我,我可以写入这个套接字(它为创建的套接字之一提供事件,其中一个事件掩码包含 EPOLLOUT)?但是这个套接字打不开,如果我尝试向它发送一些东西,我会得到一个错误 Connection refused.

另一个问题 - EPOLLHUP 是什么意思?我认为这是拒绝连接的事件。但是在这种情况下事件如何同时具有 EPOLLHUP 和 EPOLLOUT 事件?

Python 上的示例代码:

import socket
import select

poll = select.epoll()
fd_to_sock = {}
for i in range(1, 3):
    s = socket.socket()
    s.setblocking(0)
    s.connect_ex(('localhost', i))
    poll.register(s, select.EPOLLOUT)
    fd_to_sock[s.fileno()] = s

print(poll.poll(0.1))
# prints '[(4, 28), (5, 28)]'

poll保证您的应用程序在调用相应函数后不会阻塞。所以你得到了你付出的代价 - 你现在可以放心写入这个套接字不会阻塞 - 它没有阻塞,是吗?

Poll 从不保证相应的操作会成功

poll/select/epoll return 当文件描述符是 "ready" 但这只是意味着该操作不会阻塞(并不是说您一定能够成功写入)。

EPOLLIN类似:例如,当套接字关闭时它将return准备好;在这种情况下,您实际上无法从中读取数据。

EPOLLHUP 表示连接上有一个 "hang up"。只有当你真正建立联系时,才会真正发生这种情况。此外,文档 (http://linux.die.net/man/2/epoll_ctl) 说您无论如何都不需要包含它:

EPOLLHUP Hang up happened on the associated file descriptor. epoll_wait(2) will always wait for this event; it is not necessary to set it in events.