【问题标题】:Is binding to 0.0.0.0 in Java guaranteed to bind to all network interfaces?绑定到 Java 中的 0.0.0.0 是否保证绑定到所有网络接口?
【发布时间】:2012-06-19 08:26:55
【问题描述】:

我根据经验发现

Endpoint endpoint1 = Endpoint.create(new Ping());
endpoint1.publish("http://0.0.0.0:8080/ws/ping");

绑定到当前计算机上的所有网络接口(而不仅仅是 localhost - 127.0.0.1 或主机名),但我无法找到说明这是保证的文档。

问题:在哪里定义绑定到 Java 中的 0.0.0.0 将始终绑定到所有网络接口?

【问题讨论】:

  • 你的意思是,除了它是INADDR_ANY?
  • 我对Socket编程不是很熟悉。
  • 您想了解 ipv6 吗?如果你不想听,我可以假装它不存在。
  • @J-16SDiZ 有问题的主机仍然有 ipv4。随意详细说明如何正确使用 ipv6。

标签: java networking


【解决方案1】:

使用0.0.0.0 只会绑定到启用 IPv4 的接口。但是,如果您绑定到::,则应该涵盖所有 IPv4 和 IPv6 接口,假设您的 TCP/IP 堆栈(和 Java)启用了与 IPv4 兼容的 IPv6 套接字。

您需要查看内核(或套接字库,如果您在 Windows 上)以了解“为什么”的解释。在我的 OS X 系统上,man 页面解释了它。

来自man 4 inet`

可以使用本地地址INADDR_ANY 创建套接字以生效 传入消息的“通配符”匹配。 connect(2) 中的地址 或 sendto(2) 调用可以以INADDR_ANY 表示,表示“此主机”。这 可分辨地址 INADDR_BROADCAST 允许作为 如果配置了第一个网络,则主网络上的广播地址 支持广播。

来自man 4 inet6

可以使用本地地址::(等于 IPv6 地址0:0:0:0:0:0:0:0) 影响传入的“通配符”匹配 消息。

【讨论】:

    【解决方案2】:

    它与 Java 无关。 0.0.0.0 是 INADDR_ANY,这是一个特殊地址,C 套接字 API 保证any 网络接口接收,即由 Java 调用。

    【讨论】:

      【解决方案3】:

      这似乎是一个特殊的保留 IP 地址。这个链接可能有更多信息Is 0.0.0.0 a valid IP address?。所以我怀疑它没有在 Java 中记录,因为它与实际的网络规范更相关。

      正如其他人所提到的,它似乎是 Chuck Norris IP 地址:D

      HTH

      【讨论】:

      • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
      • @GeraldSchneider 所以链接到另一个 SO 问题不好吗?
      • 像查克·诺里斯 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 2017-02-08
      • 1970-01-01
      • 2020-11-06
      • 1970-01-01
      相关资源
      最近更新 更多