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

And*_*idX 6 python sockets linux multicast

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

互联网上的许多例子传给IP_ADD_MEMBERSHIPINADDR_ANY通配符地址为本地接口,和一些人指出,这将使套接字监听所有的多播数据包的接口.但是Linux ip(7)手册页说明了使用时INADDR_ANY

"系统选择合适的接口"

并且freebsd手册页说它会选择"默认界面".

因此,网上的一些答案都是错的,或者我在这里缺少一些东西.我相信有一个混乱INADDR_ANY作为一个参数使用时IP_ADD_MEMBERSHIP,和INADDR_ANY作为一个参数使用时bind()(由一个空字符串来表示),但我真的不知道.有人可以澄清发生了什么INADDR_ANY或什么0.0.0.0时候使用IP_ADD_MEMBERSHIP(即它选择默认接口或所有接口),如果它与使用时的行为不同bind

dbu*_*ush 6

INADDR_ANY作为bind调用中的地址给出时,这会使套接字在给定端口上侦听任何网络接口.

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

udp        0      0 0.0.0.0:46162           0.0.0.0:*  
Run Code Online (Sandbox Code Playgroud)

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

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

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

我曾经使用Linux,Solaris,FreeBSD和Windows,在使用时,它们都没有在所有接口上加入组播组INADDR_ANY.