在Java中绑定到0.0.0.0是否保证绑定到所有网络接口?

时间:2012-06-19 08:26:56

标签: java networking

我从经验上发现了

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将始终绑定到所有网络接口?

3 个答案:

答案 0 :(得分:13)

使用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)影响传入的“通配符”匹配        消息。

答案 1 :(得分:9)

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

答案 2 :(得分:3)

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

正如其他人提到的那样,它似乎是查克诺里斯的IP地址:D

HTH