20

起動時の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      -               

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

-Djava.net.preferIPv4Stack=true

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

上記のsshdのように、IPv4とIPv6の両方をサポートすることは可能ですか?

4

1 に答える 1

23

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つのリッスンソケットが必要です。1つはIPv4接続をリッスンし、もう1つはIPv6をリッスンします。

Windows7とWindowsServer2008は、デュアルスタックを適切に処理します。WindowsXPはそれほど多くありません:)

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

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

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

次のように、サーバーに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)ではありませんが、サンプルの原則が正確に適用されます。

于 2012-04-30T04:39:26.177 に答える