【问题标题】:Epoll events for connecting sockets用于连接套接字的 epoll 事件
【发布时间】:2016-09-01 22:34:11
【问题描述】:

我创建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)]'

【问题讨论】:

    标签: sockets networking epoll


    【解决方案1】:

    poll/select/epoll 当文件描述符“准备好”时返回,但这只是意味着操作不会阻塞(不是你一定能够成功写入它)。

    EPOLLIN 也是如此:例如,它会在套接字关闭时返回就绪;在这种情况下,您实际上将无法从中读取数据。

    EPOLLHUP 表示连接“挂断”。只有在您真正建立联系后才会真正发生这种情况。此外,文档 (http://linux.die.net/man/2/epoll_ctl) 说您无论如何都不需要包含它:

    EPOLLHUP 挂断发生在关联的文件描述符上。 epoll_wait(2) 会一直等待这个事件;没有必要在事件中设置它。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 哦,当然 =) 谢谢,我误解了 poll 的工作原理。
      猜你喜欢
      • 2013-08-08
      • 2019-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-04
      • 1970-01-01
      • 2021-11-02
      • 2014-11-22
      相关资源
      最近更新 更多