Как проверить, отвечает ли компьютер из C # - PullRequest
5 голосов
/ 07 декабря 2008

Какой самый простой способ проверить, жив ли компьютер и отвечает (скажем, в ping / NetBios)? Мне нужен детерминированный метод, который я могу ограничить по времени.

Одним из решений является простой доступ к общему ресурсу (File.GetDirectories (@ "\ compname")) в отдельном потоке и уничтожение потока, если это занимает слишком много времени.

Ответы [ 3 ]

10 голосов
/ 07 декабря 2008

Легко! Используйте System.Net.NetworkInformation средство проверки связи пространства имен!

http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx

3 голосов
/ 07 декабря 2008

Чтобы проверить определенный порт TCP (myPort) на известном сервере, используйте следующий фрагмент. Вы можете перехватить исключение System.Net.Sockets.SocketException, чтобы указать, что порт недоступен.

using System.Net;
using System.Net.Sockets;
...

IPHostEntry myHostEntry = Dns.GetHostByName("myserver");
IPEndPoint host = new IPEndPoint(myHostEntry.AddressList[0], myPort);

Socket s = new Socket(AddressFamily.InterNetwork,
    SocketType.Stream, ProtocolType.Tcp);
s.Connect(host);

Далее, специализированные проверки могут попробовать ввод-вывод с таймаутами на сокете.

1 голос
/ 04 мая 2012

Если вы хотите проверить компьютер в своей подсети, вы можете проверить его, используя ARP . Вот пример:

    //for sending an arp request (see pinvoke.net)
    [DllImport("iphlpapi.dll", ExactSpelling = true)]
    public static extern int SendARP(
                                        int DestIP, 
                                        int SrcIP, 
                                        byte[] pMacAddr, 
                                        ref uint PhyAddrLen);


    public bool IsComputerAlive(IPAddress host)
    {
        //can't check the own machine (assume it's alive)
        if (host.Equals(IPAddress.Loopback))
            return true;

        //Prepare the magic

        //this is only needed to pass a valid parameter
        byte[] macAddr = new byte[6];
        uint macAddrLen = (uint)macAddr.Length;

        //Let's check if it is alive by sending an arp request
        if (SendARP((int)host.Address, 0, macAddr, ref macAddrLen) == 0)
            return true; //Igor it's alive!

        return false;//Not alive
    }

См. Pinvoke.net для получения дополнительной информации.

...