【发布时间】:2015-10-08 17:25:36
【问题描述】:
在两个主机之间的网络套接字中,当另一端的对等端执行了有序关闭时,recv() 返回值为 0。
recv() 在用户空间监听的 netlink 套接字(用于在用户空间和内核之间进行通信)返回 0 是什么意思?
例如,在用户空间中侦听来自 RTM_NEWLINK 类型内核的 netlink 消息以及家族 NETLINK_ROUTE。
【问题讨论】:
-
有充分的理由假设它对 netlink 套接字的意义与其他任何套接字相同——连接另一端的套接字已完全关闭。在什么情况下可能发生这种情况肯定取决于您使用的是哪个 netlink 系列(粗略地说,您正在与哪个模块交谈)。
-
内核是否关闭了套接字?我有兴趣收听 RTM_NEWLINK 类型的消息。
-
如果内核的套接字端正在关闭,那么肯定是内核关闭了它。无论如何,
RTM_NEWLINK是一个消息类型。对应的 netlink 系列是NETLINK_ROUTE。我没有立即看到内核关闭这样一个套接字的任何记录原因,但很多关于此(以及所有其他 netlink 协议)是私有的和/或未记录的。 -
我不认为
send()和recv()用于 netlink 套接字,因为它们是无连接的。见:people.redhat.com/nhorman/papers/netlink.pdf