Каков наилучший способ определения наличия сетевого подключения?
Как проверить подключение к сети?
Ответ 1
Вы можете проверить сетевое подключение в .NET 2.0 с помощью GetIsNetworkAvailable()
:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Чтобы отслеживать изменения IP-адреса или изменения в доступности сети, используйте события из NetworkChange class:
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
Ответ 2
Отмеченный ответ на 100% хорош, однако есть определенные случаи, когда стандартный метод обманывается виртуальными картами (виртуальный ящик,...). Также часто желательно отказаться от некоторых сетевых интерфейсов на основе их скорости (последовательные порты, модемы,...).
Вот фрагмент кода, который проверяет эти случаи:
/// <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;
}
Ответ 3
Microsoft vista 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. Если адрес не совпадает, то предполагается, что интернет-соединение работает неправильно.
Ответ 4
Вызовите этот метод, чтобы проверить сетевое подключение.
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);