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

Ping が成功しても InetAddress.isReachable() が False を返す場合があるのはなぜですか?

Barbara Streisand
リリース: 2024-12-02 09:18:10
オリジナル
630 人が閲覧しました

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

切断の解明: InetAddress.isReachable() が誤って報告する理由

InetAddress.isReachable を使用して IP アドレスの到達可能性を判断しようとした場合() の場合、同じアドレスに正常に ping できたとしても、ユーザーは予期しない誤った応答に遭遇する可能性があります。この矛盾は、isReachable() の実装の制限に起因する可能性があります。

ネットワーク パケットをターゲット IP に直接送信する ping とは異なり、isReachable() は ICMP (インターネット) として知られるプラットフォーム依存のメカニズムに依存しています。コントロール メッセージ プロトコル) リクエストをエコーし​​ます。指定されたタイムアウト期間内に ICMP リクエストが応答されない場合、IP がまだアクセス可能であっても、isReachable() は false を返します。

クロスプラットフォーム ソリューションの提供

さまざまな接続チェックを網羅するプラットフォームに依存しないソリューションの場合は、ターゲット マシン上で開いているポートをプローブする手法の採用を検討してください。このアプローチは、ほとんどのデバイスが SSH、Web サーバー、メール サーバーなどのサービス用にオープン ポートを備えているという事実を利用します。

このメソッドを実装するコード スニペットは次のとおりです。

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

この手法を使用すると、基盤となるプラットフォームに関係なく到達可能性を判断できるようになり、より一貫した結果が保証されます。

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

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