Binden eines IPv6-Server-Sockets unter Windows
Frage
Ich versuche, einen IPv6-Server-Socket in Java 1.6 unter Windows 7 zu binden, indem ich dieses Fragment verwende:
ssock = ServerSocketChannel.open();
ServerSocket sock = ssock.socket();
sock.bind(new InetSocketAddress(InetAddress.getByAddress(new byte[16]), 0));
Leider schlägt dies mit einer IOException fehl:Adressfamilie wird von der Protokollfamilie nicht unterstützt:binden
Ich verstehe, dass Java unter der Annahme geschrieben wurde, dass Windows separate v4- und v6-Stacks verwendet (auch wenn Windows 7 dies nicht tut) und dass das Binden eines einzelnen Sockets für v4 und v6 daher nicht funktionieren kann.Dies ist jedoch nicht das, was ich versuche:Ich möchte lediglich einen v6-Socket an den binden beliebig Adresse (d. h.::).
Bearbeiten:Unter Vista schlägt es auch fehl.
Was mache ich falsch?
Lösung
Ich habe die Lösung gefunden;es ist Fehler 6230761.Die einzige unterstützte Möglichkeit zum Erstellen eines IPv6-Server-Socket-Kanals besteht darin, zuerst den Server-Socket zu erstellen:
ServerSocket s = new ServerSocket();
s.bind(new InetSocketAddress(InetAddress.getByName("::"), 0));
Bearbeiten:das bedeutet, dass NIO nicht wirklich mit IPv6 genutzt werden kann.
Andere Tipps
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 noch nicht offiziell unterstützt.Versuchen Sie, NetworkInterface.getNetworkInterfaces() und NetworkInterface.getInetAddresses() zu verwenden, um sicherzustellen, dass IPv6-Adressen tatsächlich für Ihre Java-App verfügbar sind.In den Java-Dokumenten heißt es sogar, dass der Versuch, eine IPv6-Adresse zu übergeben, wenn IPv6 nicht verfügbar ist oder wenn IPv6 deaktiviert wurde, Ausnahmen auslöst.
Ich sehe dieses Problem auch bei Jython.
http://bugs.jython.org/issue1711
Das Jython-Socket-Modul muss java.nio verwenden, da dies die einzige Möglichkeit ist, die nicht blockierende Funktionalität zu unterstützen, die für die Cpython-Kompatibilität erforderlich ist.
Ich bin äußerst enttäuscht, dass IPV6 von der neuesten Java-Version unter den neuesten Windows-Versionen nicht unterstützt wird:das ist sehr dürftig.Der IPV4-Adressraum ist bereits erschöpft:In den kommenden Monaten, geschweige denn in den kommenden Jahren, wird die Nachfrage nach IPV6-Unterstützung deutlich zunehmen.
Wir haben eine Problemumgehung für Jython-Benutzer, die die Funktion getaddrinfo() dazu zwingt, nur IPV4-Adressen zurückzugeben.Das ist ein schlechter Workaround, aber zumindest bringt es die Benutzer zum Laufen, wenn sie eine IPV4-Adresse erhalten können.
http://wiki.python.org/jython/NewSocketModule#IPV6_address_support
Es gab gerade einen weiteren Bericht des Reporters über diesen Fehler im Jython-Tracker.Er sagt, dass er erfolgreich Java.nio-Sockets mit IPV6 in einer frühen Version von JDK 1.7 verwendet hat.
http://bugs.jython.org/issue1711
Mein Blogbeitrag über IPV6-Unterstützung auf Jython war also nicht verfrüht :-)
http://jython.xhaus.com/jython-supports-ipv6/
Hmmm, meine zweite Antwort scheint über meiner ersten Antwort aufgeführt zu sein.Den Kontext finden Sie weiter unten in meiner ersten Antwort.