2012-03-04 12 views
8

私のネットワーク上の特定のホストに到達可能かどうかを調べようとしています。次のように 私のJavaコードは次のとおりです。Java InetAddress.isReachable()timeout

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

これは非常にうまく機能し、私が代わりに500ミリ秒を言うためにタイムアウトを下げた場合しかし、それはもはや到達可能なホストを指定しません。私はかなりの数のホストをループでチェックするつもりですので、タイムアウトを低くすることは非常に重要です。 Windowsのコマンドラインからホストに手動でpingを実行すると、10ミリ秒以下の時間がかかります。

なぜJavaメソッドは成功するためにはるかに高いタイムアウトが必要ですか? isReachable()を使用する方法はありますか?

答えて

5

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

+0

本当にありがとうございます。私は、検索する必要のあるデバイスで使用されているポート10001のホストに接続したい/チェックしたいと思います。既知のポートチェックを実装する方法の例を教えてください。 – Jerome

+1

さて、ノンブロッキングI/O(NIO)メソッドを実装することはしません。しかし、私はソケットを作成すると言うでしょう。宛先IPとポート10001を持つSocketAddressを作成し、適切なタイムアウトでsocket.connect(SocketAddress、timeout)を呼び出します。 Catch TimeOutException。 socket.connect()が例外なく返ってきたら、ソケットを閉じると、そのデバイスが10001をリッスンしていることがわかります。NIOモデルの場合は、Nettyのオープンソースプロジェクトとサンプルを見てください。 – brettw