ホームページ > Java > &#&チュートリアル > ping が成功すると `InetAddress.isReachable()` が False を返す場合があるのはなぜですか?

ping が成功すると `InetAddress.isReachable()` が False を返す場合があるのはなぜですか?

Susan Sarandon
リリース: 2024-12-25 03:53:12
オリジナル
341 人が閲覧しました

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

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート