使用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_ANYIP_ADD_MEMBERSHIP中用作参数时会产生混淆,而INADDR_ANYbind()中用作参数(用空字符串表示)但我不太确定。有人请说明INADDR_ANY0.0.0.0IP_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 读取吗?

了解用于套接字编程的 INADDR_ANY

HIT OS2020 Spring Lab3

关于socket绑定INADDR_ANY

时间片轮转算法和优先级调度算法模拟实现

socket绑定的ip为INADDR_ANY 的意义 htonl(INADDR_ANY)(0.0.0.0所有地址不确定地址任意地址)