Enthüllung der Trennung: Warum InetAddress.isReachable() falsch meldet
Beim Versuch, die Erreichbarkeit einer IP-Adresse mithilfe von InetAddress.isReachable zu ermitteln () können Benutzer auf unerwartete falsche Antworten stoßen, obwohl sie dieselbe Adresse erfolgreich anpingen konnten. Diese Diskrepanz kann auf Einschränkungen bei der Implementierung von isReachable() zurückgeführt werden.
Im Gegensatz zu Ping, das ein Netzwerkpaket direkt an die Ziel-IP sendet, basiert isReachable() auf einem plattformabhängigen Mechanismus namens ICMP (Internet Control Message Protocol) Echo-Anfragen. Wenn die ICMP-Anfrage nicht innerhalb des angegebenen Timeout-Zeitraums beantwortet wird, gibt isReachable() false zurück, auch wenn die IP noch erreichbar ist.
Bereitstellung einer plattformübergreifenden Lösung
Für eine plattformunabhängige Lösung, die eine Reihe von Konnektivitätsprüfungen umfasst, sollten Sie den Einsatz einer Technik in Betracht ziehen, die nach offenen Ports auf dem Zielcomputer sucht. Dieser Ansatz nutzt die Tatsache aus, dass die meisten Geräte über offene Ports für Dienste wie SSH, Webserver oder Mailserver verfügen.
Hier ist ein Codeausschnitt, der diese Methode implementiert:
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; } }
Durch die Verwendung Mit dieser Technik erhalten Sie die Möglichkeit, die Erreichbarkeit unabhängig von der zugrunde liegenden Plattform zu bestimmen und so konsistentere Ergebnisse zu gewährleisten.
Das obige ist der detaillierte Inhalt vonWarum gibt InetAddress.isReachable() manchmal „False' zurück, selbst wenn der Ping erfolgreich ist?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!