10

私は経験的にそれを見つけました

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 にバインドすると常にすべてのネットワーク インターフェイスにバインドされるとはどこで定義されていますか?

4

3 に答える 3

16

を使用0.0.0.0すると、IPv4 対応のインターフェイスにのみバインドされます。ただし、にバインドする場合::、TCP/IP スタック (および Java) で IPv4 互換の IPv6 ソケットが有効になっていると仮定すると、すべての 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受信メッセージの「ワイルドカード」マッチングに影響を与えることができます。

于 2012-06-19T23:00:43.320 に答える
9

Javaとは関係ありません。0.0.0.0 は INADDR_ANY です。これは、Java によって呼び出されるCソケット APIによって任意の ネットワーク インターフェイスから受信することが保証されている特別なアドレスです。

于 2012-06-19T10:14:26.547 に答える
3

ある種の特別な予約済み IP アドレスのようです。このリンクにはおそらく詳細情報があります 0.0.0.0 は有効な IP アドレスですか? . したがって、実際のネットワーク仕様により関連しているため、Java で文書化されていないと思われます。

そして、他の何人かが言及しているように、それはチャック・ノリスのIPアドレスのようです:D

HTH

于 2012-06-19T09:02:55.373 に答える