c - 给定任何 epoll TCP 套接字事件,如果 EPOLLRDHUP=0 且 EPOLLIN=1;后续调用 read()/recv() 是否保证返回不等于 0 的读取大小?

标签 c linux sockets tcp epoll

摘自epoll_ctl的手册:

EPOLLRDHUP (since Linux 2.6.17)

Stream socket peer closed connection, or shut down writing half of connection. (This flag is especially useful for writing simple code to detect peer shutdown when using Edge Triggered monitoring.)

来自recv的手册:

If no messages are available to be received and the peer has performed an orderly shutdown, recv() shall return 0.

在我看来,以上两个都涵盖了相同的场景,只要我首先捕获 EPOLLRDHUP 事件,我就永远不会收到长度为 0 的 read() 或 recv()(因此不会需要费心检查)。但这能保证是真的吗?

最佳答案

如果您收到带有 EPOLLRDHUP=1 的事件,则无需读取即可立即关闭连接。如果您收到 EPOLLRDHUP=0EPOLLIN=1 的事件,请继续阅读,但您应该准备好处理 recv()< 的可能性 仍然返回 0,以防万一。也许 FIN 在您获得 EPOLLIN=1 之后但在您实际调用 recv() 之前到达。

关于c - 给定任何 epoll TCP 套接字事件,如果 EPOLLRDHUP=0 且 EPOLLIN=1;后续调用 read()/recv() 是否保证返回不等于 0 的读取大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16473393/

相关文章:

linux - 关闭 PC 并在使用 BASH 之前做一些事情

c - 内存初始化时linux高内核cpu使用率

c - 网络链接套接字

c - Makefile 链接问题 - 未找到

c++ - 优化输送机执行

c - 打印 INT 的最大值

c - 打印前执行的扫描语句

linux - osx 的/etc/init.d 等效项?

收听 unix 套接字时检查发件人

c++ - 套接字编程中非法查找的可能原因