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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top