ホームページ >Java >&#&チュートリアル >ping が成功すると `InetAddress.isReachable()` が False を返す場合があるのはなぜですか?
InetAddress.isReachable() が Ping アクセシビリティにもかかわらず False を返す
Java では、InetAddress.isReachable() を使用して、指定された IP が有効かどうかを確認しますアドレスは現在のマシンから到達可能です。驚くべきことに、IP アドレスに正常に ping できても、このメソッドが false を返すシナリオに遭遇する可能性があります。この不一致は、InetAddress.isReachable() が ping と同じメカニズムを使用していないために発生します。代わりに、基盤となるプラットフォームの Internet Control Message Protocol (ICMP) 実装が採用されており、ping コマンドとは異なる場合があります。プラットフォームに依存しないソリューション
この矛盾を解消してプラットフォームの独立性を確保するには、次のアプローチを検討してください。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; } }このソリューションでは、 TCP プロトコルを使用して開いているポート (SSH の場合はポート 22、Web サーバーの場合はポート 80 または 443 など) への接続を試行することにより、指定された IP アドレスに到達できるかどうかを確認します。接続が成功すると、その IP アドレスは到達可能であるとみなされます。それ以外の場合は、到達不能を示します。
簡易バージョン
簡潔にするために、コードを次のように要約できます。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; } }これはプラットフォームに依存しません。このアプローチは、基礎となる ICMP に関係なく、IP アドレスの到達可能性を確認する信頼性の高い方法を提供します。実装。
以上がping が成功すると `InetAddress.isReachable()` が False を返す場合があるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。