2012-04-30 13 views
15

Eines unserer Java-Programme, wenn es gestartet wird, nur auf IPv6 (8080)Wie unterstützt man sowohl IPv4 als auch IPv6 auf Java

z.

# 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  -    

Das Problem ist, es von außen nicht zugänglich ist (außer localhost), dieses Problem zu lösen, ich habe diese manuell

-Djava.net.preferIPv4Stack=true 

hinzufügen Aber das Programm macht nur für IPv4-Netzwerk ist.

Ist es möglich, etwas wie die sshd wie oben zu tun, unterstützen beide IPv4 und IPv6?

Antwort

21

Ich vermute, dass es weniger ist ein Java-Programmierung Problem als ein OS-Netzwerk-Stack/OS-Netzwerk-Konfigurationsproblem:

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

Auf einigen Betriebssystemen, ein einzelner nativen TCP-Socket kann mit einem Port auf beiden hören IPv4 und IPv6 gleichzeitig. Es kann Verbindungen von Remote-IPv4 und von Remote-IPv6-Clients annehmen. Auf anderen Betriebssystemen (wie WinXP) ein OS-native Socket kann dies nicht tun, kann aber nur von IPv4 oder IPv6, nicht beide akzeptieren. Unter diesen Betriebssystemen ist es notwendig, zwei Listen Sockets zu haben, um Verbindungen von Remote IPv4 und IPv6-Clients, einen Socket für IPv4-Verbindungen und einen für IPv6 zu akzeptieren.

Windows 7 und Windows Server 2008 verarbeiten Dual-Stacks einwandfrei. Windows XP nicht so viel :)

Sie scheinen auf Linux zu sein - die meisten modernen Linux-Desktops und -Server handhaben auch dual ipv4 ipv6 ohne Probleme.

Hier ist ein guter Artikel über die Interoperabilität:

Sie wissen, wie Sie "ausschalten" IPV6 kann für Ihre Java-Anwendung: -Djava.net.preferIPv4Stack=true

Sie auch Ihren Server erzwingen IPV6 wie folgt zu verwenden: echo 0 > /proc/sys/net/ipv6/bindv6only

Dies ist wohl Ihr b est Quelle:

Sie sollten absolut in der Lage sein, zu erreichen, was Sie (zumindest auf der Java-Programmierebene) wollen, es sei denn, Sie durch externe Netzwerkprobleme beschränkt sind:

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

PS:

Hier ist ein weiterer guter Link, der erklärt, was auf der Socket-Ebene passiert.Es ist nicht Java (es ist C), aber genau die Probe Grundsätze gelten:

Verwandte Themen