当EPOLLHUP看起来足够时,为什么我们需要EPOLLRDHUP?

时间:2018-08-14 03:14:57

标签: c linux networking api-design epoll

根据Linux man page

  

EPOLLHUP

     

从管道或溪流插座等通道读取时,   此事件仅指示对等方关闭了其通道的末端。

     

EPOLLRDHUP

     

流套接字对等端关闭连接,或关闭写入一半连接。

我几乎无法分辨EPOLLHUPEPOLLRDHUP之间的区别。

对我来说,每当使用EPOLLRDHUP时,EPOLLHUP都可以以相同的语义使用。

我是对的吗?如果没有,有什么解释吗?

1 个答案:

答案 0 :(得分:-1)

  • EPOLLHUP 表示对等端关闭了连接端。 对连接的写入已关闭,并且在使用任何(可能的)可读数据后,从连接中读取的数据也会关闭。
  • EDPOLLRDHUP 仅表示对等方关闭了它们的连接,或仅关闭了一半的连接。如果它只是半关闭,则流套接字将变成单向、只写连接。 对连接的写入可能仍处于打开状态,但在消耗了任何(可能的)可读数据后,将从连接中读取的数据关闭。

如果对等方在其套接字描述符上调用 shutdown(),不允许自己写入数据,则可以这样做:

#include <sys/socket.h>

int sockfd = /* ... */;
shutdown(sockfd, SHUT_WR);