2008-12-07 4 views
5

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

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

+0

С каким портом вы должны подключиться? Учитывая, что брандмауэры - сетевые и для системы - система может быть легко доступна, но, похоже, не отвечает, если вы выбрали неправильный порт, чтобы попробовать. – tvanfosson 2008-12-07 13:38:51

+0

BTW, я бы просто хотел сказать, что когда сеть задействована, по определению не может существовать «детерминированный» метод. http://en.wikipedia.org/wiki/Deterministic_algorithm – paxos1977 2008-12-07 17:40:48

ответ

3

Чтобы проверить определенный 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); 

Кроме того, специализированные проверки могут проверять IO с таймаутами на разъеме.

1

Если вы хотите проверить компьютер в пределах собственной подсети, вы можете проверить его, используя 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 для получения дополнительной информации.

Смежные вопросы