边缘触发的 epoll 和 UDP 的 recvfrom()
edge-triggered epoll and UDP's recvfrom()
我一直在尝试学习边缘触发 epoll
编程。我对 epoll_wait
之后应该如何循环 recv
直到它 returns EAGAIN
有点困惑,当涉及到 UDP 套接字时——这是否意味着我应该遍历 recvfrom
直到它也 returns EAGAIN
吗?如果是这样,这意味着我将不得不缓冲 UDP 数据包,以防我的应用程序尝试读取的字节数少于接收到的字节数。而且,如果我循环 recvfrom
,我可能会从不同的来源获得多个数据包——我还必须缓冲 sockaddr
。这是真的?
- 是的,你应该循环直到
EAGAIN
=EWOULDBLOCK
发生。您必须在此套接字描述符上设置 O_NONBLOCK 才能实现此目的。
- 您无法接收部分 UDP 数据包。
- 您可以 return 到事件循环并在下次需要时从该套接字接收,但请注意内核可能不会唤醒您的
epol_wait
当数据包在套接字上接收时,那还没有结束EAGAIN
.
- 在循环到EAGAIN的时候,记得为了防止
reader starvation
,你应该在这个FD上保存接收未完成的信息,比如收到100个数据包。之后你应该尝试另一个 FD。当您决定返回事件循环时,只需分析保存的信息并尝试接收未收到的数据包。
- 我不明白你想说的
sockaddr
。
我一直在尝试学习边缘触发 epoll
编程。我对 epoll_wait
之后应该如何循环 recv
直到它 returns EAGAIN
有点困惑,当涉及到 UDP 套接字时——这是否意味着我应该遍历 recvfrom
直到它也 returns EAGAIN
吗?如果是这样,这意味着我将不得不缓冲 UDP 数据包,以防我的应用程序尝试读取的字节数少于接收到的字节数。而且,如果我循环 recvfrom
,我可能会从不同的来源获得多个数据包——我还必须缓冲 sockaddr
。这是真的?
- 是的,你应该循环直到
EAGAIN
=EWOULDBLOCK
发生。您必须在此套接字描述符上设置 O_NONBLOCK 才能实现此目的。 - 您无法接收部分 UDP 数据包。
- 您可以 return 到事件循环并在下次需要时从该套接字接收,但请注意内核可能不会唤醒您的
epol_wait
当数据包在套接字上接收时,那还没有结束EAGAIN
. - 在循环到EAGAIN的时候,记得为了防止
reader starvation
,你应该在这个FD上保存接收未完成的信息,比如收到100个数据包。之后你应该尝试另一个 FD。当您决定返回事件循环时,只需分析保存的信息并尝试接收未收到的数据包。 - 我不明白你想说的
sockaddr
。