用于连接套接字的 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.
我创建了 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.