web-dev-qa-db-ja.com

Java)でIPv4とIPv6の両方をサポートする方法

起動時にJavaプログラムの1つで、IPv6(8080)でのみリッスンします

例えば.

# netstat -ntpl

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -               
tcp6       0      0 :::8080                 :::*                    LISTEN      -               
tcp6       0      0 :::22                   :::*                    LISTEN      -               

問題は、外部(localhostを除く)からアクセスできないことです。これを解決するには、これを手動で追加します

-Djava.net.preferIPv4Stack=true

ただし、これにより、プログラムはIPv4ネットワーク専用になります。

上記のsshdのようなことを行うことは可能ですか?どちらもIPv4とIPv6をサポートしていますか?

17
Howard

OSネットワークスタック/ OSネットワーク構成の問題よりもJavaプログラミングの問題)ではないと思います。

http://coding.derkeiler.com/Archive/Java/comp.lang.Java.help/2009-09/msg00087.html

一部のOSでは、単一のネイティブTCPソケットは、IPv4とIPv6の両方で同時にポートをリッスンできます。リモートIPv4およびリモートIPv6クライアントからの接続を受け入れることができます。他のOS( WinXPとして)OSネイティブソケットはそれを行うことができませんが、IPv4またはIPv6からのみ受け入れることができます。両方ではありません。これらのOSでは、リモートIPv4クライアントとIPv6クライアントの両方からの接続を受け入れることができるように2つのリッスンソケットが必要です。 、IPv4接続をリッスンする1つのソケットとIPv6をリッスンする1つのソケット。

Windows7とWindowsServer 2008は、デュアルスタックを問題なく処理します。 Windows XPそれほど多くない:)

Linuxを使用しているようです。最近のほとんどのLinuxデスクトップとサーバーは、デュアルipv4ipv6も問題なく処理します。

相互運用性に関する優れた記事は次のとおりです。

Javaアプリケーション:-Djava.net.preferIPv4Stack=trueのIPV6を「オフ」にする方法を知っています。

次のように、サーバーにIPV6の使用を強制することもできます。echo 0 > /proc/sys/net/ipv6/bindv6only

これは間違いなくあなたの最高の情報源です:

外部ネットワークの問題によって制限されない限り、(少なくともJavaプログラミングレベルで))必要なことを絶対に達成できるはずです。

Nodes)      V4 Only  V4/V6  V6 Only
            -------  -----  -------
V4 Only     x        x   
V4/V6       x        x      x
V6 Only              x      x

PS:

ソケットレベルで何が起こっているかを説明するもう1つの良いリンクがあります。 Java(Cです)ではありませんが、サンプルの原則が正確に適用されます。

21
paulsm4