4

给定用户输入的 IP 地址范围(通过各种方式),我想确定其中哪些机器运行着我可以与之交谈的软件。

这是基本过程:

  1. ping 这些地址以查找可用机器

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

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

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

步骤 2-4 对我来说是直截了当的。在 .NET 中实现第一步的最佳方法是什么?

我正在查看 System.Net.NetworkInformation.Ping 类。我应该同时 ping 多个地址以加快进程吗?如果我一次 ping 一个地址且超时时间很长,则可能需要很长时间。但是如果有一个小的超时,我可能会错过一些可用的机器。

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

最重要的是,当我在拔下网络电缆的情况下扫描大量地址时,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-200扫描 192.168.2.0 到 192.168.2.255

于 2010-10-04T10:11:54.823 回答
-4

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

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

于 2010-03-18T06:26:08.677 回答