如何确保在使用epoll时阅读完整的消息

时间:2017-05-18 10:52:37

标签: c epoll

我有一些关于epoll的问题:

  1. 根据Linux man-page:
  2.   

    因为即使使用边缘触发的epoll,也可以有多个事件   在收到多个数据块时生成,调用者具有   选项指定EPOLLONESHOT标志,告诉epoll   收到事件后禁用关联的文件描述符   与epoll_wait(2)。指定EPOLLONESHOT标志时,它是   调用者有责任使用重启文件描述符   epoll_ctl(2)与EPOLL_CTL_MOD。

    如果在EPOLLONESHOT之前我没有使用readEAGAIN,我会丢失数据吗?我查看了Libevent的源代码,但他们没有使用EPOLLONESHOT

    1. 如何确保收到整个请求数据?一种解决方案是在请求数据中添加长度。还有其他解决办法吗?

1 个答案:

答案 0 :(得分:1)

如果您不使用EPOLLONESHOT,并且在获得EAGAIN之前始终阅读,则没有理由(除了代码中的错误),为什么您应该错过任何传入的数据。在这种情况下,如果使用电平触发或边沿触发,则无关紧要。因此,在获得EAGAIN之前始终阅读是最安全的。

如果您使用EPOLLONESHOT,还需要确保重新安装文件描述符。在大多数情况下,这是不必要的复杂性,所以如果你不知道为什么需要它,你就不需要它。

您的第二个问题与epoll没有直接关系。用于检测请求的开始,结束和完整性的方法取决于您使用的协议。在您的请求中某处有长度可能是其中一个选项。