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

ホストが ping 可能な場合でも、`InetAddress.isReachable()` が False を返す場合があるのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-27 19:13:11821ブラウズ

Why Does `InetAddress.isReachable()` Sometimes Return False Even When a Host is Pingable?

InetAddress.isReachable() からの誤った到達可能性の調査

IP アドレスを操作するための Java クラスである InetAddress は、さまざまなネットワーク用のメソッドを提供します。関連するタスク。そのようなメソッドの 1 つは isReachable() で、ホストがネットワーク経由でアクセス可能かどうかを判断するために使用されます。ただし、場合によっては、IP アドレスへの ping が成功した場合でも、このメソッドは false を返すことがあります。

ホストの到達可能性を確認する次のコード スニペットを考えてみましょう。

InetAddress byName = InetAddress.getByName("173.39.161.140");
System.out.println(byName);
System.out.println(byName.isReachable(1000));

Ifこのコードを実行すると、指定された IP アドレスに ping できるにもかかわらず、isReachable() が false を返す状況が発生する可能性があります。

この問題に対処するには、プラットフォームに依存せず、リモート マシン上の開いているポートに関する情報を活用する代替アプローチが提示されます。

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;
    }
}

このコードを利用すると、次の試行を行うことでホストの到達可能性を判断できます。そのホスト上の既知の開いているポートへの接続を確立します。

更新:

詳細コード スニペットの簡潔なバージョンについては、以下を参照してください。

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;
    }
}

このアプローチを採用すると、InetAddress.isReachable() が正確な情報を提供しないシナリオでも、ホストの到達可能性を確実に判断できます。表示。

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。