扫描一系列IP地址的正确方法

时间:2009-11-17 20:33:32

标签: c# .net ip-address subnet scanning

考虑到用户输入的一系列IP地址(通过各种方式),我想确定哪些机器运行的软件可以与我交谈。

以下是基本流程:

  1. Ping这些地址以查找可用的计算机

  2. 连接到可用计算机上的已知套接字

  3. 向成功建立的套接字发送消息

  4. 将响应与预期响应进行比较

  5. 步骤2-4对我来说很简单。实现.NET第一步的最佳方法是什么?

    我正在查看System.Net.NetworkInformation.Ping类。我应该同时ping多个地址以加快进程吗?如果我一次ping一个地址并超时,可能需要永久。但是由于暂停时间很短,我可能会错过一些可用的机器。

    即使我知道地址指向活动的计算机,有时ping似乎也会失败。如果请求被丢弃,我是否需要ping两次?

    最重要的是,当我在网络电缆拔出时扫描大量地址时,Ping会在FreeUnmanagedResources()中抛出NullReferenceException。 !?

    有关扫描一系列IP的最佳方法的指示吗?

4 个答案:

答案 0 :(得分:4)

不要忘记在防火墙规则中拒绝ping的人的头痛。

我唯一的建议可能是一个问题:你必须做#1吗?

难道你不能简单地尝试连接到那个已知的套接字吗?成功连接到该插座可以一举两得:是的,主机在那里/有效,是的,已知套接字是打开的。

这种情况确实很适合多线程,在另一个线程上启动它,并等待它回来...

答案 1 :(得分: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;
   }

答案 2 :(得分:0)

正如很多人提到Ping不是检测机器是否存活的最佳方法,如果绝对必须检测子网上的所有可用机器,您可以使用nmap扫描仪使用的一些技巧来检测可用机等。

您可以使用nmap -sP 192.168.2.1-200将192.168.2.0扫描到192.168.2.255

答案 3 :(得分:-3)

听起来像是有人试图编写僵尸网络并扫描受感染PC的子网。

几乎没有理由“检测网络上的计算机”,让他们在他们想要的时候与他们交谈。