4

ユーザーが (さまざまな方法で) 入力した一連の IP アドレスから、どのマシンと通信できるソフトウェアが実行されているかを特定したいと考えています。

基本的なプロセスは次のとおりです。

  1. これらのアドレスに ping を実行して、使用可能なマシンを見つけます

  2. 利用可能なマシンの既知のソケットに接続します

  3. 正常に確立されたソケットにメッセージを送信します

  4. 期待される応答と応答を比較する

ステップ2〜4は私にとって簡単です。.NET で最初のステップを実装する最良の方法は何ですか?

System.Net.NetworkInformation.Ping クラスを見ています。プロセスを高速化するには、複数のアドレスに同時に ping を実行する必要がありますか? 長いタイムアウトで一度に 1 つのアドレスに ping を実行すると、永遠にかかる可能性があります。しかし、タイムアウトが短いと、利用可能なマシンを見逃してしまう可能性があります。

アドレスがアクティブなマシンを指していることがわかっている場合でも、ping が失敗しているように見えることがあります。リクエストが破棄された場合、ping を 2 回行う必要がありますか?

さらに、ネットワーク ケーブルを抜いた状態で大量のアドレス コレクションをスキャンすると、Ping は FreeUnmanagedResources() で NullReferenceException をスローします。!?

このような一連の IP をスキャンするための最良のアプローチについての指針はありますか?

4

4 に答える 4

4

ファイアウォール ルールで ping を拒否する人々の頭痛の種を忘れないでください。

私の唯一の提案はおそらく質問です: あなたは #1 をしなければなりませんか?

その既知のソケットに接続しようとすることはできませんか? そのソケットへの接続が成功すると、一石二鳥です。はい、ホストはそこにいます/生きており、はい、既知のソケットが開いています。

このタイプの状況は、マルチスレッドに適していて、別のスレッドで起動し、答えが返ってくるのを待ちます...

于 2009-11-17T20:38:23.330 に答える
4

すべてのマシンが ping に応答するわけではないため (ファイアウォールの設定によって異なります)、可能であればステップ 1 をスキップすることをお勧めします。

ping に応答するために接続するマシンがわかっている場合は、ping クラスで十分に機能します。1 つのパケットしか送信しないため、ドロップされた場合に備えて ping を複数回実行します。また、私の経験では、ホストに到達できない場合、ping クラスは PingReply オブジェクトを返す代わりに例外をスローすることがよくあります。

これは私の提案する実装​​です:

public bool
   Ping (string host, int attempts, int timeout)
   {
      System.Net.NetworkInformation.Ping  ping = 
                                       new System.Net.NetworkInformation.Ping ();

      System.Net.NetworkInformation.PingReply  pingReply;

      for (int i = 0; i < attempts; i++)
      {
         try
         {
            pingReply = ping.Send (host, timeout); 

            // If there is a successful ping then return true.
            if (pingReply != null &&
                pingReply.Status == System.Net.NetworkInformation.IPStatus.Success)
               return true;
         }
         catch
         {
            // Do nothing and let it try again until the attempts are exausted.
            // Exceptions are thrown for normal ping failurs like address lookup
            // failed.  For this reason we are supressing errors.
         }
      }

      // Return false if we can't successfully ping the server after several attempts.
      return false;
   }
于 2009-11-17T21:02:20.987 に答える
0

多くの人が言及しているように、Ping はマシンが稼働しているかどうかを検出する最良の方法ではありません。サブネット上で使用可能なすべてのマシンを検出することが絶対に必要な場合は、nmap スキャナーのトリックを使用して、使用可能なマシンを検出できます。

nmap -sP 192.168.2.1-200192.168.2.0 から 192.168.2.255 をスキャンするために使用できます。

于 2010-10-04T10:11:54.823 に答える
-4

誰かがボットネットを作成し、感染した PC のサブネットをスキャンしようとしているように思えます。

「ネットワーク上のコンピューターを検出する」理由はほとんどありません。代わりに、必要なときにいつでも話しかけてもらいます。

于 2010-03-18T06:26:08.677 に答える