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

时间:2013-05-10 00:36:29

标签: c linux sockets tcp epoll

来自epoll_ctl的手册:

  

EPOLLRDHUP(自Linux 2.6.17开始)

     

流套接字对等关闭连接,或关闭写入一半的连接。 (此标志对于编写简单代码以在使用边沿触发监视时检测对等关闭特别有用。)

来自recv的手册:

  

如果没有可以接收的消息并且对等体已经执行了有序关闭,则recv()将返回0.

在我看来上面的两个都涵盖了相同的场景,并且只要我首先捕获EPOLLRDHUP事件,我就不应该收到长度为0的read()或recv()(因此不要#39 ; t需要打扰检查这样的)。但这是否保证是真的?

1 个答案:

答案 0 :(得分:7)

如果您收到EPOLLRDHUP=1的活动,则只需立即关闭连接而不阅读。如果您收到EPOLLRDHUP=0EPOLLIN=1的活动,请继续阅读,但您应该准备好处理recv()仍然返回0的可能性,以防万一。在您FIN之后但在实际呼叫EPOLLIN=1之前,recv()可能会到达。