4 ответов:
вы можете проверить наличие сетевого подключения в .NET 2.0 с помощью
GetIsNetworkAvailable():System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()для отслеживания изменений в IP-адресе или изменений в доступности сети используйте события из NetworkChange класс:
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
отмеченный ответ на 100% прекрасен, однако есть определенные случаи, когда стандартный метод обманывается виртуальными картами (virtual box, ...). Также часто желательно отказаться от некоторых сетевых интерфейсов в зависимости от их скорости (последовательные порты, модемы, ...).
вот кусок кода, который проверяет эти случаи:
/// <summary> /// Indicates whether any network connection is available /// Filter connections below a specified speed, as well as virtual network cards. /// </summary> /// <returns> /// <c>true</c> if a network connection is available; otherwise, <c>false</c>. /// </returns> public static bool IsNetworkAvailable() { return IsNetworkAvailable(0); } /// <summary> /// Indicates whether any network connection is available. /// Filter connections below a specified speed, as well as virtual network cards. /// </summary> /// <param name="minimumSpeed">The minimum speed required. Passing 0 will not filter connection using speed.</param> /// <returns> /// <c>true</c> if a network connection is available; otherwise, <c>false</c>. /// </returns> public static bool IsNetworkAvailable(long minimumSpeed) { if (!NetworkInterface.GetIsNetworkAvailable()) return false; foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) { // discard because of standard reasons if ((ni.OperationalStatus != OperationalStatus.Up) || (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) continue; // this allow to filter modems, serial, etc. // I use 10000000 as a minimum speed for most cases if (ni.Speed < minimumSpeed) continue; // discard virtual cards (virtual box, virtual pc, etc.) if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) continue; // discard "Microsoft Loopback Adapter", it will not show as NetworkInterfaceType.Loopback but as Ethernet Card. if (ni.Description.Equals("Microsoft Loopback Adapter", StringComparison.OrdinalIgnoreCase)) continue; return true; } return false; }
Microsoft windows vista и 7 используют NCSI (индикатор состояния сетевого подключения) техника:
- NCSI выполняет поиск DNS на www.msftncsi.com, затем просит http://www.msftncsi.com/ncsi.txt. этот файл является обычным текстовым файлом и содержит только текст'Microsoft NCSI'.
- NCSI отправляет запрос поиска DNS для dns.msftncsi.com. этот DNS-адрес должен разрешаться до 131.107.255.255. Если адрес не совпадает, то это предположить, что подключение к интернету не правильно.
вызовите этот метод для проверки сетевого подключения.
public static bool IsConnectedToInternet() { bool returnValue = false; try { int Desc; returnValue = Utility.InternetGetConnectedState(out Desc, 0); } catch { returnValue = false; } return returnValue; }поместите это ниже строки кода.
[DllImport("wininet.dll")] public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);
Comments