【问题标题】:recv() returning 0 in a netlink socketrecv() 在 netlink 套接字中返回 0
【发布时间】: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

标签: c linux sockets netlink


【解决方案1】:

在两个主机之间的网络套接字中,当另一端的对等端执行了有序关闭时,recv() 返回值为 0。

这不是它在 man 页面中所说的。它说

当对端执行有序关闭时,返回值为0。

关于“在两台主机之间的网络套接字中”的部分是你的发明。

那里的规范适用于recv(), 期间。

recv() 在用户空间监听的 netlink 套接字(用于在用户空间和内核之间进行通信)返回 0 是什么意思?例如,在用户空间中侦听来自 RTM_NEWLINK 类型内核的 netlink 消息以及家族 NETLINK_ROUTE。

意思完全一样。它是一个套接字,它已连接,recv() 返回零 => 对等端已执行有序关闭。

【讨论】:

  • 发现netlink socket中接收0的意思是EOF。在这种情况下,我不明白这意味着什么。这是否意味着内核已发送所有可用数据或内核已关闭套接字?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多