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

Tho*_*sen 10 java networking

我从经验上发现了这一点

Endpoint endpoint1 = Endpoint.create(new Ping());
endpoint1.publish("http://0.0.0.0:8080/ws/ping");
Run Code Online (Sandbox Code Playgroud)

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

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

mpo*_*llo 14

使用0.0.0.0仅绑定到启用IPv4的接口.但是,如果绑定::,应覆盖所有IPv4和IPv6接口,假设您的TCP/IP堆栈(和Java)启用了IPv4兼容的IPv6套接字.

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

来自man 4 inet:

可以使用本地地址INADDR_ANY创建套接字,以对传入消息实现"通配符"匹配.在一个地址连接(2)SENDTO(2)呼叫可被给定为INADDR_ANY指"该主机".如果配置的第一个网络支持广播,则允许区分地址INADDR_BROADCAST作为主网络上广播地址的简写.

来自man 4 inet6:

可以使用本地地址'::'(等于IPv6地址0:0:0:0:0:0:0:0)创建套接字,以影响对传入消息的"通配符"匹配.


use*_*421 9

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