边缘触发的 epoll 和 UDP 的 recvfrom()

edge-triggered epoll and UDP's recvfrom()

我一直在尝试学习边缘触发 epoll 编程。我对 epoll_wait 之后应该如何循环 recv 直到它 returns EAGAIN 有点困惑,当涉及到 UDP 套接字时——这是否意味着我应该遍历 recvfrom 直到它也 returns EAGAIN 吗?如果是这样,这意味着我将不得不缓冲 UDP 数据包,以防我的应用程序尝试读取的字节数少于接收到的字节数。而且,如果我循环 recvfrom,我可能会从不同的来源获得多个数据包——我还必须缓冲 sockaddr。这是真的?

  1. 是的,你应该循环直到 EAGAIN=EWOULDBLOCK 发生。您必须在此套接字描述符上设置 O_NONBLOCK 才能实现此目的。
  2. 您无法接收部分 UDP 数据包。
  3. 您可以 return 到事件循环并在下次需要时从该套接字接收,但请注意内核可能不会唤醒您的 epol_wait 当数据包在套接字上接收时,那还没有结束EAGAIN.
  4. 在循环到EAGAIN的时候,记得为了防止reader starvation,你应该在这个FD上保存接收未完成的信息,比如收到100个数据包。之后你应该尝试另一个 FD。当您决定返回事件循环时,只需分析保存的信息并尝试接收未收到的数据包。
  5. 我不明白你想说的 sockaddr