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

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

Susan Sarandon
Susan SarandonOriginal
2024-12-25 03:53:12344Durchsuche

Why Does `InetAddress.isReachable()` Sometimes Return False When Ping Succeeds?

InetAddress.isReachable() gibt trotz Ping-Erreichbarkeit „Falsch“ zurück

In Java wird InetAddress.isReachable() verwendet, um zu überprüfen, ob eine bestimmte IP vorhanden ist Die Adresse ist vom aktuellen Computer aus erreichbar. Überraschenderweise kann es zu einem Szenario kommen, in dem diese Methode „false“ zurückgibt, obwohl Sie die IP-Adresse erfolgreich anpingen können.

Diese Inkonsistenz entsteht, weil InetAddress.isReachable() nicht denselben Mechanismus wie Ping verwendet. Stattdessen wird die Implementierung des Internet Control Message Protocol (ICMP) der zugrunde liegenden Plattform verwendet, die sich vom Ping-Befehl unterscheiden kann.

Plattformunabhängige Lösung

Zur Adressierung Um diese Diskrepanz zu beseitigen und Plattformunabhängigkeit zu erlangen, sollten Sie den folgenden Ansatz in Betracht ziehen:

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 Lösung prüft die Erreichbarkeit der angegebenen IP-Adresse durch Versuche um über das TCP-Protokoll eine Verbindung zu einem offenen Port (z. B. Port 22 für SSH, Port 80 oder 443 für Webserver usw.) herzustellen. Wenn die Verbindung erfolgreich ist, gilt die IP-Adresse als erreichbar; andernfalls weist es auf Unerreichbarkeit hin.

Kurze Version

Der Kürze halber können Sie den Code wie folgt zusammenfassen:

private static boolean isReachable(String addr, int openPort, int timeOutMillis) {
    try (Socket soc = new Socket()) {
        soc.connect(new InetSocketAddress(addr, openPort), timeOutMillis);
        return true;
    } catch (IOException ex) {
        return false;
    }
}

Dies ist plattformunabhängig Der Ansatz bietet eine zuverlässige Möglichkeit, die Erreichbarkeit einer IP-Adresse unabhängig von der zugrunde liegenden ICMP-Implementierung festzustellen.

Das obige ist der detaillierte Inhalt vonWarum gibt „InetAddress.isReachable()' manchmal „False' zurück, wenn der Ping erfolgreich ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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