Antworten:
Sie können in .NET 2.0 nach einer Netzwerkverbindung suchen, indem Sie GetIsNetworkAvailable()
:
System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()
Verwenden Sie die Ereignisse aus der NetworkChange- Klasse, um Änderungen der IP-Adresse oder Änderungen der Netzwerkverfügbarkeit zu überwachen :
System.Net.NetworkInformation.NetworkChange.NetworkAvailabilityChanged
System.Net.NetworkInformation.NetworkChange.NetworkAddressChanged
NetworkInterface.GetIsNetworkAvailable()
war in meiner Anwendung (.NET 4.5, Windows 10) sehr unzuverlässig, insbesondere wenn sie in einer virtuellen Maschine ausgeführt wurde. Der Umgang mit den Ereignissen von NetworkAvailabilityChanged
war zuverlässig.
Die markierte Antwort ist 100% in Ordnung. In bestimmten Fällen wird die Standardmethode jedoch von virtuellen Karten (virtuelle Box, ...) getäuscht. Es ist auch oft wünschenswert, einige Netzwerkschnittstellen aufgrund ihrer Geschwindigkeit (serielle Schnittstellen, Modems, ...) zu verwerfen.
Hier ist ein Code, der nach diesen Fällen sucht:
/// <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 und 7 verwenden die NCSI-Technik (Network Connectivity Status Indicator):
Rufen Sie diese Methode auf, um die Netzwerkverbindung zu überprüfen.
public static bool IsConnectedToInternet()
{
bool returnValue = false;
try
{
int Desc;
returnValue = Utility.InternetGetConnectedState(out Desc, 0);
}
catch
{
returnValue = false;
}
return returnValue;
}
Fügen Sie dies unter die Codezeile ein.
[DllImport("wininet.dll")]
public extern static bool InternetGetConnectedState(out int Description, int ReservedValue);