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

时间:2017-09-06 03:19:32

标签: python linux sockets multicast

在Python中,当我们想要创建一个侦听多播流量的脚本时,我们将套接字的IP_ADD_MEMBERSHIP选项设置为一个值,该值包含多播组地址和本地接口的地址。听取小组的流量。

Internet上的许多示例都将IP_ADD_MEMBERSHIP INADDR_ANY通配符地址作为本地接口传递给<{1>} ,并说明这将使套接字侦听< strong>所有接口,用于组播数据包。但是,Linux ip(7)手册页指出使用INADDR_ANY

  

&#34;系统选择适当的界面&#34;

并且freebsd手册页说它会选择&#34;默认界面&#34;。

因此,网上的一些答案都是错误的,或者我在这里缺少一些东西。我相信INADDR_ANYIP_ADD_MEMBERSHIP中用作参数时会产生混淆,INADDR_ANY用作bind()中的参数(由空字符串表示)时会产生混淆但我不太确定。有人可以澄清INADDR_ANY0.0.0.0IP_ADD_MEMBERSHIP中使用时发生的情况(即选择默认界面或所有界面),以及与{{1}一起使用时其行为有何不同}?

1 个答案:

答案 0 :(得分:5)

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

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

udp        0      0 0.0.0.0:46162           0.0.0.0:*  

这是一个与INADDR_ANY端口46162绑定的UDP套接字。

当设置IP_ADD_MEMBERSHIP选项时用作接口地址时,INADDR_ANY表示操作系统将选择一个接口加入给定的组播组,即&#34;默认&#34;网络接口。

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

我曾在Linux,Solaris,FreeBSD和Windows上工作过,使用INADDR_ANY时,他们都没有在所有接口上加入组播组。