Kann keine Verbindung zu IPv6-Host von Java herstellen

9

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.

    
just-boris 17.03.2015, 15:56
quelle

3 Antworten

14

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.

%Vor%

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, nicht telnet - 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:

%Vor%

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:

lanwen 15.06.2016, 17:06
quelle
8

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%     
Alexander Gryanko 27.06.2017 23:25
quelle
0

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)

    
user3127286 15.03.2016 09:14
quelle

Tags und Links