使用 epoll 时如何确保我阅读了完整的消息
How can I make sure I read a complete message when using epoll
我有几个关于 epoll
的问题:
- 根据 Linux 手册页:
Since even with edge-triggered epoll, multiple events can be
generated upon receipt of multiple chunks of data, the caller has the
option to specify the EPOLLONESHOT flag, to tell epoll to
disable the associated file descriptor after the receipt of an event
with epoll_wait(2). When the EPOLLONESHOT flag is specified, it is
the caller's responsibility to rearm the file descriptor using
epoll_ctl(2) with EPOLL_CTL_MOD.
如果我不使用 EPOLLONESHOT
而我 read
直到我得到 EAGAIN
,我会丢失数据吗?我查看了 Libevent
的源代码,他们没有使用 EPOLLONESHOT
.
- 如何确保我们收到完整的请求数据?一种解决方案是在请求数据中增加长度。还有其他解决方案吗?
如果您不使用 EPOLLONESHOT
并且您总是阅读直到获得 EAGAIN
,那么没有任何理由(除了您的代码中的错误)为什么您应该错过任何传入数据。在这种情况下,无论您使用电平触发还是边沿触发都没有关系。因此,最安全的做法是始终阅读直到获得 EAGAIN
.
如果您使用 EPOLLONESHOT
,您还需要确保重新设置文件描述符。在大多数情况下这是不必要的复杂性,所以如果您不知道为什么需要它,您就不需要它。
你的第二个问题与epoll
没有直接关系。您用于检测请求的开始、结束和完整性的方法取决于您使用的协议。在您的请求中的某处添加长度可能是一种选择。
我有几个关于 epoll
的问题:
- 根据 Linux 手册页:
Since even with edge-triggered epoll, multiple events can be generated upon receipt of multiple chunks of data, the caller has the option to specify the EPOLLONESHOT flag, to tell epoll to disable the associated file descriptor after the receipt of an event with epoll_wait(2). When the EPOLLONESHOT flag is specified, it is the caller's responsibility to rearm the file descriptor using epoll_ctl(2) with EPOLL_CTL_MOD.
如果我不使用 EPOLLONESHOT
而我 read
直到我得到 EAGAIN
,我会丢失数据吗?我查看了 Libevent
的源代码,他们没有使用 EPOLLONESHOT
.
- 如何确保我们收到完整的请求数据?一种解决方案是在请求数据中增加长度。还有其他解决方案吗?
如果您不使用 EPOLLONESHOT
并且您总是阅读直到获得 EAGAIN
,那么没有任何理由(除了您的代码中的错误)为什么您应该错过任何传入数据。在这种情况下,无论您使用电平触发还是边沿触发都没有关系。因此,最安全的做法是始终阅读直到获得 EAGAIN
.
如果您使用 EPOLLONESHOT
,您还需要确保重新设置文件描述符。在大多数情况下这是不必要的复杂性,所以如果您不知道为什么需要它,您就不需要它。
你的第二个问题与epoll
没有直接关系。您用于检测请求的开始、结束和完整性的方法取决于您使用的协议。在您的请求中的某处添加长度可能是一种选择。