【问题标题】:Why do we need EPOLLRDHUP when EPOLLHUP seems enough? [duplicate]当 EPOLLHUP 看起来足够时,为什么我们还需要 EPOLLRDHUP? [复制]
【发布时间】:2018-08-14 03:14:56
【问题描述】:

根据linuxman page

EPOLLHUP

从管道或流套接字等通道读取时, 此事件仅表示对等方关闭了其通道的末端。

EPOLLRDHUP

Stream socket peer 关闭连接,或关闭写入一半连接。

我几乎无法区分EPOLLHUPEPOLLRDHUP

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

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

【问题讨论】:

标签: c linux networking api-design epoll


【解决方案1】:
  • EPOLLHUP 表示对等端关闭了连接端。 关闭写入连接,在消耗任何(可能的)可读数据后,从连接中读取也关闭。
  • EDPOLLRDHUP 仅表示对等方关闭了他们的连接,或者只关闭了一半的连接。如果它只是中途关闭,流套接字将变成单向、只写连接。 写入连接可能仍处于打开状态,但在消耗任何(可能的)可读数据后,从连接中读取将关闭。

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

#include <sys/socket.h>

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

【讨论】:

  • 不可能。本地主机无法检测到对等方关闭套接字和关闭它以进行输出之间的任何区别。
  • @user207421 我不明白。我在哪里说过 localhost 可以区分?关闭以在对等方或本地主机的角度输出?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
相关资源
最近更新 更多