Odpowiedzi:
Możesz sprawdzić połączenie sieciowe w .NET 2.0 za pomocą GetIsNetworkAvailable()
:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Aby monitorować zmiany adresu IP lub zmiany dostępności sieci, użyj zdarzeń z klasy NetworkChange :
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
NetworkInterface.GetIsNetworkAvailable()
był bardzo zawodny w mojej aplikacji (.NET 4.5, Windows 10), szczególnie podczas pracy na maszynie wirtualnej. Obsługa zdarzeń od NetworkAvailabilityChanged
była niezawodna.
Zaznaczona odpowiedź jest w 100% w porządku, jednak zdarzają się przypadki, gdy standardowa metoda jest oszukiwana przez wirtualne karty (wirtualne pudełko, ...). Często pożądane jest również odrzucenie niektórych interfejsów sieciowych na podstawie ich szybkości (porty szeregowe, modemy, ...).
Oto fragment kodu, który sprawdza te przypadki:
/// <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 i 7 używają technologii NCSI (wskaźnik stanu łączności sieciowej):
Wywołaj tę metodę, aby sprawdzić połączenie sieciowe.
public static bool IsConnectedToInternet()
{
bool returnValue = false;
try
{
int Desc;
returnValue = Utility.InternetGetConnectedState(out Desc, 0);
}
catch
{
returnValue = false;
}
return returnValue;
}
Umieść poniższy wiersz kodu.
[DllImport("wininet.dll")]
public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);