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

最佳答案

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

关于linux - 边缘触发的epoll和UDP的recvfrom(),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36140413/

10-11 06:25