2012-01-22 22 views
1

同じローカルネットワーク上にある、つまり同じサブネットマスクを持つシステムをすべて検索したいとします。特定のポートで実行されるサブネットのすべてのIPアドレスを取得する方法

私はInetAddressクラスで動作する必要がありますが、私は何をすべきか分かりません。 私のアルゴリズムは次のとおりです。

  1. 彼らは私の要求されたポート上で実行した場合、ローカルネットワーク内のすべての使用可能なシステムに

  2. チェックして下さい

  3. を念頭に置いて実行するシステムのIPをキープこのポートの

InetAddress localHost = Inet4Address.getLocalHost(); 
NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localHost); 
System.out.println(networkInterface); 
networkInterface.getByInetAddress(localHost); 

for(){ 
    networkInterface.getByInetAddress(localHost) 
} 

私はnetworkInterface.getByInetAddress(localHost)が私にサブネット内のすべての利用可能なIPアドレスを与えることができると思いますが、私はどのように利用できるすべてのシステムでこれを行うことができないのですか?for句の条件は何ですか?

+1

getbyInetAddressは、指定されたネットワークアドレスにバインドされたマシン上のネットワークインタフェースを返します。どのアドレスがローカルネットワークの他の場所で使用されているかはわかりません。あなたがローカルでできることは、どのIPが使用されているかを教えてくれるものではありません。そのためには、ルータ/ arpテーブルを調べなければなりません。 –

答えて

4

のすべてを見つけること IPサブネット内のIPアドレスは簡単です。サブネット内の可能なすべてのbyte[]表現を列挙するループを作成し、InetAddressインスタンスを構築してください。

、ハードビットは、この2つの問題は簡単ビット解決されています

:与えられたため

  • あなたはすべてのライブ IPアドレス、サブネット上の場合は見つけるのですかどのように

    、および

  • をIPアドレス、特定のポートを使用しているかどうかをどのように把握していますか?

最初の問題は、2つの方法で解決することができます。

  • あなたはホストがpingに応答するかどうかを確認するためにInetAddress.isAlive()メソッドを使用することができます。問題は、一部のホストがpingに応答しないように設定されているか、pingが内部ファイアウォールによってブロックされている可能性があることです。サブネットが大きい場合は、これも機能しません。問題は、多数のホストにpingする必要があることです。これは長い時間がかかり、多くのネットワークトラフィックを生成します。特に、これを行うアプリケーションインスタンスが複数ある場合は特にそうです。

  • よりスマートな方法は、ローカルマシンのARPキャッシュを調べ、それが知っているすべてのIPアドレスを抽出することです。問題は、1)アプリケーションがARPキャッシュにアクセスするためのアクセス権を持たないこと、2)IPアドレスがキャッシュにないこと、3)純粋なJavaでARPキャッシュにアクセスすることができないこと、3)それはTCPベースのサービスであれば、あなたが使用してIP /ポートへの接続を試みることができ、

    第二の問題は、ポート上のサービスの性質に依存しますプレーンソケット。接続が受け入れられた場合、ポートは何かによって使用されています。それはあなたが期待するサービスかもしれないし、そうでないかもしれませんが、それを伝える唯一の方法はサービスを使用しようとすることです。

  • UDPベースのサービスの場合は、一般的にはの何かがポートを使用しているかどうかを知るために、現在はです。

    は「私は(私のプログラムを実行しているコンピュータ)と同じローカルネットワーク上のすべてのシステムを検出したいですのプライマリIPアドレス:私はあなたが以下の意味ことを期待するつもりだ

+0

IPサブネット内のすべての可能なIPアドレスを見つけることは簡単です。サブネット内のすべての可能なbyte []表現を列挙し、それらのためのInetAddressインスタンスを構築するループを書くだけです。私の問題はこれらの文章にあります。どのようにこのループを実装できますか? – hirad

+0

申し訳ありませんが、コードを書くつもりはありません。 Javaを数ヶ月経験した人なら誰でも簡単にやることができるのは比較的単純な作業だと言えば十分です。私はこれを行う既存のJavaライブラリを認識していません。 (おそらく、ライブラリを探すよりもコードを書くほうが簡単でしょう。) –

+0

これは簡単ですが、ここに書き込んで尋ねるのは簡単です! – hirad

0

特定のTCPポートをリッスンしています。

UDPの場合、これはやや難しい問題です。バウンスを探すことはできますが、パケットは食いつぶされたり、失われたりする可能性があります(返信の可能性があります)。

ここで、TCPと仮定すると、3つのステップがあります。

  1. 「プライマリ」と思われるローカルインターフェイスのIPアドレスを取得します。
  2. このアドレスと同じサブネット上のホストを列挙します。
  3. 各ホストについて、適切なポートがリスンしているかどうかを確認します。

手順1では、InetAddress.getLocalHost()を使用します。

手順2では、取得したアドレスのサブネット部分を取得し、そのサブネット内のすべての可能なホストを試してください。それがクラスCであり、わずか254のホストがあることを望みましょう。 各ホストを試すことなく、すべてのホストを取得する方法は100%ありません。 100%未確認の(より複雑な)方法は、ARPテーブルを使用してネットワークのルーターのビューを取得したり、ブロードキャストpingをローカルネットに送信したり、レイヤー2に落ちてブロードキャストイーサネットパケットを送信したりすることです。

手順3では、適切なポートの各ホストへの接続を開いて閉じます。接続がタイムアウトまたは拒否された場合は、ホストをスクラッチします。それ以外の場合は、「リスニング」リストに追加します。一度に複数の接続を試し、タイムアウト間隔を何か小さなものに設定したいと思うかもしれません。なぜなら、ほとんどの人はリッスンしないからです。

ステップ4:おめでとうございます!あなたはちょうどJavaでnmapの非常に機能が悪いバージョンを作った。

+0

ありがとう、しかし、私はどのようにJavaでステップ2を実装することができますか? – hirad

+0

@hirad:IPアドレスは2つの部分、 "ネットワークマスク"と "ホストマスク"に分かれています。ネットワークマスクを維持し、すべての可能なホストを試してください。したがって、 "192.168.1.56/24"は、001から254までの可能なすべてのXXXについて "192.168.1.XXX"を意味します。 – Borealid

+0

はそれを行うJavaライブラリではありませんか? – hirad

関連する問題