【问题标题】:What is the purpose and result of using INADDR_ANY?使用 INADDR_ANY 的目的和结果是什么?
【发布时间】:2018-02-14 09:57:32
【问题描述】:

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

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

"系统选择了合适的接口"

freebsd 手册页说它将选择“默认界面”。

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

【问题讨论】:

    标签: python linux sockets multicast


    【解决方案1】:

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

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

    udp        0      0 0.0.0.0:46162           0.0.0.0:*  
    

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

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

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

    我曾使用过 Linux、Solaris、FreeBSD 和 Windows,但在使用 INADDR_ANY 时,它们都没有在所有接口上加入多播组。

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多