Warum inetAddress.isReachable() trotz erfolgreichem Ping „Falsch“ zurückgibt
Ihr Code ruft eine InetAddress-Instanz für eine bestimmte IP-Adresse ab und ruft diese dann auf isReachable()-Methode mit einem Timeout von 1000 Millisekunden:
InetAddress byName = InetAddress.getByName("173.39.161.140"); System.out.println(byName); System.out.println(byName.isReachable(1000));
Überraschenderweise gibt isReachable() jedoch false zurück, obwohl Sie die IP-Adresse erfolgreich anpingen können.
Ursache und Lösung
Ursache:
isReachable() verlässt sich nicht auf den Ping Befehl oder andere betriebssystemspezifische Tools. Stattdessen verwendet es das ICMP-Protokoll, um zu überprüfen, ob der Host erreichbar ist, indem es ICMP-Echo-Request-Nachrichten sendet und auf ICMP-Echo-Antwortnachrichten wartet. Einige Systeme blockieren möglicherweise den ICMP-Verkehr, was zum Ausfall der isReachable()-Methode führt.
Lösung:
Um die Erreichbarkeit zu bestimmen, ohne sich auf isReachable() zu verlassen, können Sie die verwenden Folgender Java-Code:
private static boolean isReachable(String addr, int openPort, int timeOutMillis) { // Any Open port on other machine // openPort = 22 - ssh, 80 or 443 - webserver, 25 - mailserver etc. try (Socket soc = new Socket()) { soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis); return true; } catch (IOException ex) { return false; } }
Diese Methode versucht, eine Verbindung zum angegebenen offenen Port auf dem Remote-Computer herzustellen. Wenn die Verbindung erfolgreich ist, bedeutet dies, dass der Host erreichbar ist. Der offene Port kann jeder Port sein, der normalerweise zugänglich ist, z. B. 22 für SSH, 80 für HTTP oder 443 für HTTPS.
Das obige ist der detaillierte Inhalt vonWarum gibt „InetAddress.isReachable()' „False' zurück, obwohl der Ping erfolgreich ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!