gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:49:55 30 4
gpt4 key购买 nike

摘自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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com