0

ホーム ネットワークに接続されているマシンのアドレスを検索する Java プログラムを作成しようとしています。私の最初のアイデアは、192.168.1.[0-254] の範囲内の各アドレスを調べて、そのアドレスを持つマシンがネットワーク上にあるかどうかを確認することですが、特定のアドレスがそのアドレスのマシンがあります。考えられるすべてのポートでソケットを開いてみて、それらがすべて失敗した場合はマシンがないと結論付けることができると思いますが、一見したところ、マシンがない場合は時間がかかりすぎているようです (確認に 1 分以上かかりました)。マシンが接続されていないアドレスの 2 つのポートのみ)。

指定したアドレスのマシンがあるかどうかをすばやく簡単に確認する方法はありますか? すべてのアドレスを試す以外に、Javaでこれを行うより良い方法はありますか?

助けてくれてありがとう

4

3 に答える 3

1

ネットワーク上のどの IP が使用されているかを知りたいだけの場合は、nmapを使用してください。

これを自分で行う方法を知りたい場合は、まず C で作業することをお勧めします。すべてのソケット APIは C で記述されており、おそらくソケットを操作するための最も自然な環境です。(さらに、TCP/IP Illustratedでは C を使用しているため、例を簡単に見つけることができます。)

とはいえ、 ICMP を使用した Java の例があります。それらはすべてjnetpcapまたはJpcaplibpcap (基礎となる C ライブラリ) のラッパーを使用します。

ポートスキャンを行いたい場合は、いくつかのアプローチを取ることができます:

  • アプリケーションをマルチスレッド化できます。100 または 200 スレッドのスレッドプールを作成し、「ジョブ」を送信しconnect()て、開いている可能性のある各 (IP、ポート) ペアに試行します。IP ごとに 65,000 個のポートがあり、接続タイムアウトが非常に長くなる可能性があるため (コードが ICMP Host or Port unreachable 応答を取得しない場合RST)、これは非常に遅くなり、メモリを大量に消費する可能性があります。接続が 3 秒または 5 秒で確立されない場合、各スレッドにアラームを設定できます...

  • 下位レベルに切り替えて、libpcapまたは同様のツールを使用して手作りの接続試行を送信し、応答のみをメモすることができます(接続を設定する必要はありません)。これは が採用したアプローチの 1nmapつであり、アプリケーションよりもはるかに迅速に回答が得られる理由の 1 つです。

于 2011-06-05T02:41:55.377 に答える
0

それはICMP PINGを送信するので使用できますが、それを使用InetAddress.isReachable(int timeout)する許可の落とし穴がいくつかあります(詳細についてはSOを検索してください)。

を使用して UDP パケットを送信し、sDatagramSocketを探すこともできますPortUnreachableException。それらをポート 7 (エコー) に送信すると、例外が発生するか、応答として送信したのと同じデータが返されます。この方法には、リッスンしていないポートで UDP パケットを受信したときに、ネットワーク上のすべてのホストが応答を送信する必要があるため、いくつかの問題もあります。通常はそうしますが、ファイアウォールによって除外される場合があります。

pingコマンドを実行するだけが最も簡単な方法かもしれません。

于 2011-07-04T21:34:36.090 に答える
0

Runtime.exec を使用して ping コマンドを発行するか、Java 自体で ping クライアントを開発してみてください。ping を使用すると、すべてのポートをチェックする必要がなくなります。

于 2011-06-05T01:42:19.837 に答える