- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
根据poll man page , poll 函数可以返回 POLLHUP 和 POLLRDHUP 事件。据我了解,只有 POLLHUP 符合 POSIX,而 POLLRDHUP 是 Linux 非标准扩展。但是,两者似乎都表示连接的写入端已关闭,所以我不明白 POLLRDHUP 相对于 POLLHUP 的附加值。有人可以解释一下两者之间的区别吗?
最佳答案
不,当 poll()
ing 套接字时,POLLHUP
将在两个 方向发出连接已关闭的信号。
POLLRDHUP
将在另一端调用shutdown(SHUT_WR)
或当本端调用shutdown(SHUT_RD)
时设置,但是连接可能在另一个方向上仍然存在。
你可以看看net/ipv4/tcp.c
内核源码:
if (sk->sk_shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
mask |= EPOLLHUP;
if (sk->sk_shutdown & RCV_SHUTDOWN)
mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
SHUTDOWN_MASK
是 RCV_SHUTDOWN|SEND_SHUTDOWN
。 RCV_SHUTDOWN
在接收到 FIN
数据包时设置,而 SEND_SHUTDOWN
在 FIN
数据包被确认时设置另一端,套接字进入 FIN-WAIT2
状态。
[除了TCP_CLOSE
部分,该片段被所有协议(protocol)复制;并且整个事情对于 unix 套接字等的工作方式类似]
还有其他重要区别 -- POLLRDHUP
(与 POLLHUP
不同)必须在 .events
中明确设置,以便在.revents
.
POLLRDHUP
仅适用于套接字,不适用于 fifos/pipes 或 ttys。
关于linux - POLLHUP 与 POLLRDHUP?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56177060/
根据poll man page , poll 函数可以返回 POLLHUP 和 POLLRDHUP 事件。据我了解,只有 POLLHUP 符合 POSIX,而 POLLRDHUP 是 Linux 非标
我在我的程序中使用了poll()函数,我读到this link要使用 POLLRDHUP 标志,您必须在包含所有头文件之前定义 _GNU_SOURCE。我需要这个标志,以便轮询套接字可以告诉我客户端是
我是一名优秀的程序员,十分优秀!