Как проверить, отвечает ли компьютер из C#
Какой самый простой способ проверить, жив ли компьютер и отвечает (скажем, в ping/NetBios)? Я хотел бы детерминистический метод, который я могу ограничить по времени.
Одним из решений является простой доступ к общему ресурсу (File.GetDirectories(@"\compname")) в отдельном потоке и уничтожение потока, если это занимает слишком много времени.
3 ответа
Легко! использование System.Net.NetworkInformation
пинг объект пространства имен!
http://msdn.microsoft.com/en-us/library/system.net.networkinformation.ping.aspx
Чтобы проверить определенный порт 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 с таймаутами на сокете.
Если вы хотите проверить компьютер в своей подсети, вы можете проверить его с помощью 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 для получения дополнительной информации.