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