Heim > Java > javaLernprogramm > Warum gibt „InetAddress.isReachable()' „False' zurück, obwohl der Ping erfolgreich ist?

Warum gibt „InetAddress.isReachable()' „False' zurück, obwohl der Ping erfolgreich ist?

Mary-Kate Olsen
Freigeben: 2024-12-07 01:58:12
Original
1002 Leute haben es durchsucht

Why Does `InetAddress.isReachable()` Return False Even Though Ping Succeeds?

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));
Nach dem Login kopieren

Ü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;
    }
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage