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

ping が成功しても `InetAddress.isReachable()` が False を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-07 01:58:12
オリジナル
1002 人が閲覧しました

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

ping が成功したにもかかわらず inetAddress.isReachable() が False を返す理由

コードは、特定の IP アドレスの InetAddress インスタンスを取得し、そのインスタンスを呼び出しますタイムアウトが 1000 の isReachable() メソッドミリ秒:

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));
ログイン後にコピー

しかし、驚くべきことに、IP アドレスに正常に ping できても、isReachable() は false を返します。

原因と解決策

原因:

isReachable() は、ping コマンドやその他のオペレーティング システム固有のツールに依存しません。代わりに、ICMP プロトコルを使用して、ICMP エコー要求メッセージを送信し、ICMP エコー応答メッセージを待機することによって、ホストが到達可能かどうかを確認します。一部のシステムは ICMP トラフィックをブロックし、isReachable() メソッドの失敗につながる可能性があります。

解決策:

isReachable() に依存せずに到達可能性を判断するには、次の Java コード:

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;
    }
}
ログイン後にコピー

このメソッドは、リモート マシン上の指定された開いているポートへの接続を試みます。接続が成功した場合は、ホストに到達可能であることを意味します。オープンポートには、SSH の場合は 22、HTTP の場合は 80、HTTPS の場合は 443 など、通常アクセス可能な任意のポートを指定できます。

以上がping が成功しても `InetAddress.isReachable()` が False を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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