检查远程计算机是否脱机的最快方法

时间:2015-06-13 10:32:51

标签: c# network-programming remote-access

我需要以最快的方式检查远程计算机是否关闭。我尝试过一些方法,但没有一种方法能给我所需的时间速度(它应该小于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秒才能抛出异常。 有什么想法吗?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

鉴于它只适用于一台计算机,为什么不在单独的线程上运行您的答案逻辑并缓存计算机的状态?您的上下文弹出窗口将从此缓存中读取并“即时”响应,但确切的状态可能会延迟几秒......现在,取决于您之后使用计算机做什么(您在答案中未提及),这可能是一种考虑......

的方法

答案 2 :(得分:0)

因为你依赖于很多因素(网络负载,数据包丢失等),此外,当计算机在收到请求时没有立即响应时并不一定说它在线,你不能假设电脑处于离线状态。 我认为你不能比ping请求更快地完成它。