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

4
通过用户输入的IP地址范围(通过各种方式输入),我想确定哪些机器上运行了我可以进行通信的软件。
以下是基本过程:
1. Ping这些地址以查找可用机器 2. 连接到可用机器上的已知套接字 3. 向成功建立的套接字发送消息 4. 将响应与预期响应进行比较
对于我来说,步骤2-4很直截了当。在.NET中实现第一步的最佳方法是什么?
我正在查看System.Net.NetworkInformation.Ping类。我应该同时ping多个地址以加快进程速度吗?如果我一次只ping一个地址并设置长时间超时,那可能需要很久。但是,如果超时时间短,我可能会错过一些可用的机器。
有些时候,即使我知道地址指向的是活动主机,Ping似乎也会失败。在请求被丢弃的情况下,我需要ping两次吗?
最重要的是,当我断开网络电缆扫描大量地址时,Ping会在FreeUnmanagedResources()中抛出NullReferenceException异常!
请提供有关像这样扫描IP范围的最佳方法的指针。

我仍然遇到ping不可靠的问题,但是由于它们太耗时,我无法实施这里建议的答案。 - Josh G
4个回答

4

由于不是所有机器都会响应ping命令(取决于防火墙设置),如果可能的话建议跳过第1步。

如果您知道要连接的机器会响应ping命令,则ping类足够好用。它只发送一个数据包,因此请多次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;
   }

4
不要忘记那些会在防火墙规则中拒绝ping的人所面临的问题。
我的唯一建议是也许可以问一个问题:你是否必须执行#1?
你不能尝试连接到已知的套接字吗?成功连接到该套接字可以一箭双雕:确认主机是否存在/在线,以及已知套接字是否打开。
这种情况很适合多线程处理,启动另一个线程并等待其返回答案...

这种方法唯一的问题就是时间。如果地址范围超过 256 个地址,尝试打开每一个套接字是否可行?超时需要多长时间?我能同时尝试打开几个套接字吗? - Josh G
你可以例如创建4个异步套接字并开始尝试连接到机器,这样你就可以同时尝试4个连接。添加任意数量的套接字! - DaMacc
唯一的问题是由于防火墙等原因,ping 是不可靠的。唯一的替代方法是完全跳过它。我可能会采用像 @DaMacc 建议的那样 - 只需每次开 N 线程... - Yoopergeek
在某些情况下,我能同时使用的套接字数量有限制吗?如果有,最高数量是多少? - Josh G
我重复之前的评论:“我不精通套接字编程…” 很抱歉,我不知道你该如何处理。也许是时候问另一个问题了? - Yoopergeek
显示剩余2条评论

0

正如许多人所提到的,Ping并不是检测机器是否存活的最佳方法。如果必须检测子网上所有可用的机器,则可以使用一些nmap扫描程序使用的技巧来检测可用的机器。

您可以使用nmap -sP 192.168.2.1-200来扫描192.168.2.0至192.168.2.255。


你可以使用 nmap -sP 192.168.2.1-200 命令扫描 192.168.2.0 到 192.168.2.255 的 IP 地址。 - Vitalij
1
好的,但这是一个关于如何在C#中完成同样事情的问题,所以我想问一下您能否阐明nmap技巧与在C#中完成此操作的关系? - Maslow

-5

听起来很像有人试图编写一个僵尸网络并扫描受感染的个人电脑子网。

几乎没有理由去“检测网络上的计算机”,让它们在需要时与您交流。


实际上,这是一个用于硬件设备的配置工具。我正在尝试确定设备的位置。让设备与我交流不会改变问题。它们将随机发送ping请求来查找配置PC,就像配置PC现在正在做的那样。 - Josh G

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接