【问题标题】:The fastest way to check whether remote computer is offline检查远程计算机是否离线的最快方法
【发布时间】:2015-06-13 10:32:51
【问题描述】:

我需要一种最快的方法来检查远程计算机是否关闭。我尝试了一些方法,但它们都没有给我想要的时间速度(它应该小于 0.5 秒,这很关键,因为发生在上下文菜单弹出窗口中)

            //using System.Net
            IPHostEntry ipHostInfo = Dns.GetHostEntry(hostName);
            //if error occurs - remote computer is off

            //using System.Net.NetworkInformation
            Ping ping = new Ping();
            PingReply pingReply = ping.Send(hostIp);
            if (pingReply.Status != IPStatus.Success)
            {
                //Remote computer is off
            }

            //using System.Management
            ManagementScope scope = new ManagementScope(@"\\" + hostName + @"\root\cimv2", null);
            scope.Connect();
            //if error occurs - remote computer is off

据我所知,最快的方法是使用 Dns.GetHostEntry(hostName) - 但仍然需要大约 3 秒才能引发异常。 有什么想法吗?

【问题讨论】:

  • 您要检查的计算机列表是否有限?
  • 是的,每次只有一台特定的计算机。
  • 除非您能保证远程计算机在线时能在 0.5 秒内响应,否则您的要求是不可能的,而您无法保证。

标签: c# network-programming remote-access


【解决方案1】:

使用Ping with timeout。此版本的 Send 方法将允许您指定等待响应的时间。如果您定义 500 毫秒,并且您正在检查的服务器不在地球的另一端或在非常高延迟的 Internet 连接上,那么您可以非常可靠地说目标机器已关闭或您的 Internet 连接有问题。

Dns.GetHostEntry 不检查主机是启动还是关闭。这适用于 DNS,仅尝试解析主机名。即使主机名存在并且仅使用的 DNS 服务器没有响应,DNS 也可能很慢并且可能超时。

【讨论】:

  • 谢谢,好像是个办法。问题是在某些网络上可能会禁止 ping。
  • 如果 ping 不被允许,你可以使用其他超时方法——比如 TCP 开放端口检查,甚至 HTTP 请求。但 ICMP 是轻量级的,因此速度最快。在您的情况下它很慢的事实是该方法的其他版本中的默认超时远高于 500 毫秒。还要避免使用带有主机名参数的 Send 方法。始终使用带有 IPAddress 的那个来指定目标机器。
【解决方案2】:

鉴于它仅适用于一台计算机,为什么不让答案的逻辑在单独的线程上运行并缓存计算机的状态?您的上下文弹出窗口将从该缓存中读取并“立即”做出反应,但确切的状态可能会延迟几秒钟......现在,取决于您之后对计算机所做的事情(您没有在答案中提及),这可能是一种考虑的方法......

【讨论】:

  • 当我说“一台计算机”时,我的意思是“列表中的一台”,即可能还有更多。但是单独的线程结合其他方法,比如 ping 可能是不错的解决方案。
  • 是的,我的意思是一个固定的计算机列表,而不是“任何计算机”......这样你就可以有一个单独的线程每 X 秒检查一次它们的状态,并且你的弹出窗口快如闪电。
【解决方案3】:

因为您取决于很多因素(网络负载、数据包丢失等),另外,当计算机在收到请求时没有立即响应时,不一定说它在线,您不能假设计算机离线。 我认为你不能比 ping 请求更快。

【讨论】:

  • 在我的测试中,ping 是最慢的。而且我不能确定是否允许 ping - 这取决于网络安全设置。
  • 了解计算机X的唯一真正方法是在线,而不仅仅是使用过时IP地址X的计算机以某种方式创建服务,该服务将响应应客户要求检查其寿命。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多