2009-08-31 4 views
5

Ich versuche, einen IPv6-Server-Socket in Java 1.6 auf Windows 7, mit diesem Fragmente zu binden:Bindung einen IPv6-Server-Socket auf Windows

ssock = ServerSocketChannel.open(); 
ServerSocket sock = ssock.socket(); 
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0)); 

Leider ist dies nicht mit einer IOException: Adresse Familie nicht durch Protokoll unterstützt Familie: bind

Ich verstehe, dass Java mit der Annahme geschrieben wird, dass Windows separate v4 und v6-Stacks verwendet (obwohl Windows 7 nicht), und dass daher ein einzelnes Socket für v4 und v6 nicht funktionieren kann. Dies ist jedoch nicht, was ich versuche zu tun: Ich möchte nur einen v6-Sockel an die Adresse Adresse (d. H. :).

Bearbeiten: Es schlägt auch auf Vista fehl.

Was mache ich falsch?

Antwort

7

Ich fand die Lösung; es ist bug 6230761. Der einzige unterstützte Weg, um einen IPv6-Server-Socket-Kanal zu erstellen, ist die Serversocket erstellen zuerst:

ServerSocket s = new ServerSocket(); 
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0)); 

bearbeitet: Das bedeutet, dass NIO kann nicht wirklich mit IPv6 verwendet werden.

+0

Wenn ich die "EVALUATION" im verlinkten Fehlerbericht richtig verstanden habe, sollte dies bereits in Java 7 b36 + behoben sein. Ist mein Verständnis richtig? – wilx

1

Dieser Fehler bedeutet, dass Sie eine IPv6-Adresse mit einem Nicht-IPv6-Protokoll mischen. Das bedeutet wahrscheinlich, dass der ServerSocketChannel, mit dem Sie beginnen, IPv6 nicht unterstützt. Ich glaube nicht, dass Java Windows 7 offiziell unterstützt. Versuchen Sie es mit NetworkInterface.getNetworkInterfaces() und NetworkInterface.getInetAddresses(), um sicherzustellen, dass IPv6-Adressen tatsächlich für Ihre Java-App verfügbar sind. Die Java-Dokumentation sagt sogar, dass der Versuch, eine IPv6-Adresse zu übergeben, wenn IPv6 nicht verfügbar ist oder wenn IPv6 deaktiviert wurde, zu Ausnahmen führt.

+0

Ich schaute getInetAddresses, und es erkennt tatsächlich die IPv6-Adressen. Wie bekomme ich einen ServerSocketChannel, der IPv6 unterstützt? –

0

Ich sehe dieses Problem mit Jython auch.

http://bugs.jython.org/issue1711

Die jython Buchsenmodul muss java.nio verwenden, da dies der einzige Weg ist, die nicht-blockierende Funktionalität zu unterstützen, die CPython Kompatibilität erfordert.

Ich bin sehr enttäuscht zu sehen, dass IPV6 nicht von den neuesten Java auf den neuesten Windows unterstützt wird: das ist sehr schlecht. Der IPV4-Adressraum ist bereits erschöpft: In den kommenden Monaten wird die IPV6-Unterstützung noch viel stärker nachgefragt werden, geschweige denn Jahre.

Wir haben eine Problemumgehung für jython-Benutzer, die die Funktion getaddrinfo() zwingt, nur IPV4-Adressen zurückzugeben. Es ist ein schlechter Workaround, aber es bringt zumindest die Benutzer zum Laufen, wenn sie eine IPV4-Adresse bekommen können.

http://wiki.python.org/jython/NewSocketModule#IPV6_address_support

0

Es gab nur ein weiterer Bericht der Reporter dieser Fehler auf dem jython Tracker. Er sagt, dass er erfolgreich mit java.nio Sockets mit IPV6 auf einer frühen Version von JDK 1.7 war.

http://bugs.jython.org/issue1711

So war mein Blog-Post über IPV6-Unterstützung auf jython nicht verfrüht :-)

http://jython.xhaus.com/jython-supports-ipv6/

Hmmm, es scheint, dass meine zweite Antwort hat über meine erste Antwort gelistet. Siehe meine erste Antwort unten für Kontext.

Verwandte Themen