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

时间:2016-03-21 19:57:46

标签: linux sockets udp epoll

我一直在尝试学习边缘触发的epoll编程。我很困惑关于epoll_wait之后如何循环recv直到它返回EAGAIN的UDP套接字 - 这是否意味着我应该循环recvfrom,直到它返回EAGAIN为止?如果是这样,这意味着我将不得不缓冲UDP数据包,以防我的应用程序尝试读取比接收的字节更少的字节。但是,如果我循环recvfrom,我可能会从不同的来源获得多个数据包 - 我也可能需要缓冲sockaddr s。这是真的?

1 个答案:

答案 0 :(得分:2)

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