gpt4 book ai didi

sockets - 监听器套接字上的epoll_wait()和伪造的故障

转载 作者:行者123 更新时间:2023-12-03 11:54:21 26 4
gpt4 key购买 nike

我看到了epoll_wait()和监听器套接字之间的以下交互。创建监听器套接字的事件顺序为:

  • 调用socket()
  • 调用bind()
  • 调用fcntl()并设置为非阻塞
  • epoll_ctl()EPOLL_CTL_ADD调用EPOLLET | EPOLLONESHOT | EPOLLIN
  • 调用listen()

  • 有一些后台线程为此套接字和其他套接字调用 epoll_wait(),如果在第4步和第5步之间恰好这样做,则会为监听器套接字接收 EPOLLHUP事件。将顺序更改为:
  • 调用socket()
  • 调用bind()
  • 调用fcntl()并设置为非阻塞
  • 调用listen()
  • epoll_ctl()EPOLL_CTL_ADD调用EPOLLET | EPOLLONESHOT | EPOLLIN

  • 解决了此问题,但是现在我看到在建立连接但没有为监听器套接字接收到 EPOLLIN事件的情况下出现的虚假故障。

    我知道也可以使用电平触发模式,但是我想使这种模式适用于边沿触发模式。

    对这个问题有什么想法吗?

    最佳答案

    EPOLLONESHOT的语义是,一旦epoll_wait()提取了某个描述符的通知,您将不得不调用epoll_ctl()EPOLL_CTL_MOD来重新启用该描述符上的通知。因此,您可能会因为EPOLLONESHOT禁用了被动/监听套接字上的通知而丢失了连接。 (通常,除非有特殊情况,否则不应该使用EPOLLONESHOT;它不是自动添加到自己代码中的样板或伏都教。)

    此外,在使用非阻塞式边缘触发语义的情况下,在通知监听套接字已输入就绪的通知中,需要循环调用accept(),直到报告EAGAIN错误为止。仅调用一次accept()可能会将其他连接留在队列中,此外,在将新的连接添加到该队列之前,不会发生另一个边缘触发的EPOLLIN事件。 (也就是说,假设未指定EPOLLONESHOT,或者每次下一次调用epoll_wait()之前都重新启用描述符。)

    添加消除EPOLLONESHOT当然值得尝试。您为什么仍然需要它?

    关于sockets - 监听器套接字上的epoll_wait()和伪造的故障,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14221339/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com