Ich habe einige IPv6-only Hosts. Ich kann die curl-Anfrage erfolgreich ausführen durch die Locke
%Vor%Aber wenn ich versuche, es von Java zu bekommen, habe ich einen Fehler:
%Vor%Stapelverfolgung:
%Vor%Es ist ein Problem bei Java v1.7.0_65 und v1.8.0_40, MacOS 10.10.2 aufgetreten. Auf der Vorgängerversion MacOS 10.9.5 funktioniert es gut.
Was ist los? Wie es möglich ist, dass der Host von curl
erreichbar und von Java nicht erreichbar ist.
Ich habe auch versucht, -Djava.net.preferIPv6Addresses=true
und -Djava.net.preferIPv4Stack=false
zu spielen und es konnte nicht helfen.
UPD hat in OpenJDK einen verwandten Fehler gefunden, JDK-8015415
UPD 2 Wenn ich versucht habe, eine kabelgebundene Verbindung anstelle von WLAN zu verwenden, hat es mir geholfen. Seltsam.
Es kann ein Problem in der Zusammenarbeit mit AirDrop + Java sein.
Kurze Antwort - versuchen Sie:
%Vor%Untersuchung des untenstehenden Problems (Danke für Sergey Shinderuk):
Wir haben solchen Code in Java zu reproduzieren:
%Vor% Und wenn wir WiFi benutzen, bekomme die Ausnahme: java.net.NoRouteToHostException: No route to host
Während bei telnet alles in Ordnung ist:
%Vor%Wenn wir WLAN ausschalten und Kabelverbindung verwenden - alles in Ordnung. Aber wenn wir eine kabelgebundene Verbindung verwenden, aber WLAN eingeschaltet ist - dieser Java-Code wird nicht funktionieren. Was sehr seltsam ist.
Wir müssen Argumente für die connect(2)
zwischen Java und Telnet vergleichen.
Sie können sehen, dass wir das zweite Argument von connect(2)
als struct sockaddr_in6
gedruckt haben. Außerdem können Sie alle erwarteten Informationen sehen: AF_INET6
, Port 80 und ipv6-Adresse.
Notieren Sie sich: Wir haben
./telnet
gestartet, nichttelnet
-dtrace
kann nicht arbeiten mit System-Binärdateien, die von Apple signiert wurden. Also sollten wir es kopieren.
Gleiches gilt für Java:
%Vor% Wie wir sehen können, ist der Hauptunterschied, dass telnet sin6_len == 0
, aber java - sin6_scope_id = 0x8
sendet. Das Hauptproblem in genau sin6_scope_id
. telnet und curl sendet scope_id == 0
, aber java - 0x8
. Und wenn wir eine Kabelverbindung verwenden, sendet Java scope_id == 0xb
.
Um es klar zu machen, versuchen wir das Problem mit scope_id
mit Telnet zu reproduzieren.
Mit WiFi tun:
Also kann telnet eine Verbindung mit 0xb
herstellen, aber nicht mit 0x8
.
Es scheint, dass der richtige Ort dieses Codes für Java ist: Ссылка
Wir haben gesehen, dass scope_id
mit dem Wert des privaten Feldes java.net.NetworkInterface.defaultIndex gefüllt ist, das den Index einer Standardschnittstelle enthält.
Wir können alle Indizes mit Code drucken:
%Vor%Auf WLAN:
%Vor%An verkabelt
%Vor%An verdrahtet + wifi
%Vor% Wenn WLAN verbunden ist, ist defaultIndex == 8
und die Standardschnittstelle ist awdl0.
Also wir nur
%Vor%und Java-Code funktioniert.
Auch:
WiFriedX kann helfen.
Ein weiteres Problem: Ссылка
Was ist awd: Was ist AWDL (Apple Wireless Direct Link) und wie funktioniert es?
Der Autor dieses Patches ist Ссылка .
Erläuterung:
Sie müssen libnet.dylib mit otool öffnen und das _setDefaultScopeID Symbol finden:
%Vor%Hier finden Sie einen Vergleich mit 0 und bedingten Sprung:
%Vor%Sie müssen bedingten Sprung zu unbedingten Sprung mit jedem Hex-Editor ersetzen:
%Vor%Oder verwenden Sie diesen einen Zeilenbefehl:
%Vor%Wired Verbindung hilft mir auch.
Mit
$ java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
Tags und Links java ipv6 httpclient osx-yosemite