我一直在努力学习边缘触发编程。我对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/