使用INADDR_ANY的目的和结果是什么?

What is the purpose and result of using INADDR_ANY?

在 Python 中,当我们想要制作一个侦听多播流量的脚本时,我们将套接字的 IP_ADD_MEMBERSHIP 选项设置为一个由多播组地址和一个地址组成的值它将侦听组流量的本地接口。

Internet 上的许多示例将 IP_ADD_MEMBERSHIP INADDR_ANY 通配符地址作为本地接口,并且 一些 声明这将使套接字在 所有 接口上侦听多播数据包。然而 Linux ip(7) 手册页指出,当使用 INADDR_ANY

"an appropriate interface is chosen by the system"

freebsd 手册页说它将选择 "default interface"。

所以要么网上的一些答案是错误的,要么我在这里遗漏了什么。我认为在 IP_ADD_MEMBERSHIP 中用作参数时 INADDR_ANYbind() 中用作参数时 INADDR_ANY (由空字符串表示)存在混淆,但我'我不太确定。有人可以澄清在 IP_ADD_MEMBERSHIP 中使用 INADDR_ANY0.0.0.0 时发生了什么(即它选择默认接口或所有接口)以及在与 [=22= 一起使用时是否表现不同]?

INADDR_ANY 作为 bind 调用中的地址给出时,这会导致套接字在给定端口上侦听 any 网络接口。

以这种方式调用 bind 后,您将在 netstat 命令的输出中看到这样的条目:

udp        0      0 0.0.0.0:46162           0.0.0.0:*  

这是绑定到 INADDR_ANY 端口 46162 的 UDP 套接字。

在设置IP_ADD_MEMBERSHIP选项时用作接口地址时,INADDR_ANY表示OS将选择一个接口加入给定的多播组,即"default" 网络接口。

不是意味着它将在所有接口上加入该组。为此,您需要遍历所有网络接口并在每个接口上设置 IP_ADD_MEMBERSHIP 选项。

我曾使用 Linux、Solaris、FreeBSD 和 Windows,其中 none 在使用 INADDR_ANY 时在所有接口上加入了多播组。