2012-04-30 17 views
15

開始時のJavaプログラムの1つは、IPv6(8080)JavaでIPv4とIPv6の両方をサポートする方法

のようなものです。

# 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をサポートしていますか?

私はそれがスタック/ OSのネットワーク構成の問題ネットワーキングOS未満Javaプログラミングの問題だ疑い

答えて

21

:いくつかのOS上で

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

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

Windows 7およびWindows Server 2008では、デュアルスタックが問題なく処理されます。 Windows XPはそれほどではありません:)

あなたはLinuxにいるようです - ほとんどの現代的なLinuxデスクトップとサーバーは、問題なくデュアルipv4 ipv6も処理します。

あなたはJavaアプリケーションのためのIPV6を "オフ" することができます方法を知っている:あなたは、あなたのサーバーに強制することができます-Djava.net.preferIPv4Stack=true

ここ

は、相互運用性の良い記事ですこのようにIPV6を使用する: echo 0 > /proc/sys/net/ipv6/bindv6only

これは間違いなくあなたのbですESTソース:

Nodes)  V4 Only V4/V6 V6 Only 
      ------- ----- ------- 
V4 Only  x  x 
V4/V6  x  x  x 
V6 Only    x  x 
:あなたは、外部ネットワークの問題により制限されている場合を除き

あなたは絶対に、(少なくともJavaプログラミングレベルで)あなたが欲しいものを達成することができるはずです

PS:

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

関連する問題