使用INADDR_ANY的目的和结果是什么?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用INADDR_ANY的目的和结果是什么?相关的知识,希望对你有一定的参考价值。
在Python中,当我们想要制作一个侦听多播流量的脚本时,我们设置套接字的IP_ADD_MEMBERSHIP
选项,其值包含多播组地址和本地接口的地址,它将在该接口上侦听组的流量。
Internet上的许多示例都将IP_ADD_MEMBERSHIP
通配符地址作为本地接口传递给INADDR_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
一起使用时其行为有何不同?
当INADDR_ANY
作为bind
调用中的地址给出时,这会导致套接字在给定端口上侦听任何网络接口。
以这种方式调用bind
之后,你会在netstat
命令的输出中看到这样的条目:
udp 0 0 0.0.0.0:46162 0.0.0.0:*
这是一个UDP套接字,它与INADDR_ANY
绑定了端口46162。
当在设置IP_ADD_MEMBERSHIP
选项时用作接口地址时,INADDR_ANY
表示操作系统将选择一个接口来加入给定的多播组,即“默认”网络接口。
这并不意味着它将在所有接口上加入该组。要做到这一点,您需要迭代所有网络接口并在每个接口上设置IP_ADD_MEMBERSHIP
选项。
我使用过Linux,Solaris,FreeBSD和Windows,在使用INADDR_ANY
时,它们都没有在所有接口上加入组播组。
以上是关于使用INADDR_ANY的目的和结果是什么?的主要内容,如果未能解决你的问题,请参考以下文章
在 WinSock 中通过 127.0.0.1 发送的多播可以用 INADDR_ANY 读取吗?
socket绑定的ip为INADDR_ANY 的意义 htonl(INADDR_ANY)(0.0.0.0所有地址不确定地址任意地址)