8

ネットワーク上の特定のホストが到達可能かどうかを確認しようとしています。私のJavaコードは次のとおりです。

InetAddress adr = InetAddress.getByName(host);
if(adr.isReachable(3000)){
    System.out.println(host + " is reachable");
}

これは非常にうまく機能しますが、代わりにタイムアウトを 500 ミリ秒に下げると、ホストが到達可能であることが示されなくなります。かなりの数のホストをループでチェックする予定なので、タイムアウトを短くすることは非常に重要です。Windows コマンド ラインから手動でホストに ping を実行すると、10 ミリ秒もかかりません。

では、なぜ Java メソッドが成功するために、はるかに長いタイムアウトが必要なのでしょうか? を使用する代替手段はありますisReachable()か?

4

1 に答える 1

6

到達可能性の意味によって異なります。特定のポートでリッスンしている到達可能なホストしか見つからない場合は、そのポートへのソケット接続を開くことができます (たとえば、ポート 80 をチェックしてすべての HTTP サーバーを見つける)。InetAddress.isReachable() の使用は実装に依存します。javadoc によると、「典型的な実装では ICMP ECHO REQUEST が使用されます」。Java NIO (ノンブロッキング I/O) を使用した「既知のポート」チェック (http(80)、smb (445) など) は、より高いパフォーマンスを実現できます。私の会社には、「既知のポート」スキャンを使用して、NIO を使用して Telnet または SSH を実行しているボックスを検索する製品があり、約 5000 IP/秒をスキャンできます。

于 2012-03-04T14:30:51.430 に答える