Wie überprüfe ich eine Netzwerkverbindung?

Antworten:

153

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
Mitch Wheat
quelle
9
Kümmert sich dies um "begrenzte Verfügbarkeit"?
Tofutim
Dies funktioniert in WPF nicht immer. Einige Laptops geben false und andere true zurück
krilovich
Funktioniert das wirklich? Ich habe gerade diese Zeile geschrieben und meinen Router ausgeschaltet und gebe immer noch true zurück!
Mushfiq
1
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 NetworkAvailabilityChangedwar zuverlässig.
Eskimwier
Das ist nicht zuverlässig. Lesen Sie stackoverflow.com/a/25779403/2377343
T.Todua
174

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;
    }
Simon Mourier
quelle
17
Dies ist richtig und verdient viele positive Stimmen. Ich habe festgestellt, dass das in der akzeptierten Antwort erwähnte NetworkAvailabilityChanged-Ereignis nicht zuverlässig ausgelöst wird, was wahrscheinlich durch virtuelle Adapter verursacht wird, wie in dieser Antwort erwähnt
Marek,
1
+1 für die zusätzliche Prüfung für virtuelle Maschinen. Bin gestern einfach auf diesen Fall gestoßen. Aber ich denke immer noch, dass dies nicht mit 'Hype-V' umgeht, da sie nicht 'virtuell' in ihrem Namen haben.
Herdo
3
@Herdo - ja, der Code ist nicht perfekt und ich glaube nicht, dass es in einer virtuellen Welt etwas Perfektes geben kann . Aber du kannst es verbessern.
Simon Mourier
@ SimonMourier Du hast recht. Ich wollte nur beachten, dass, wenn jemand immer noch wahr zurückgegeben wird, wenn es keine Verbindung gibt -> Dies könnte ein Problem sein :)
Herdo
1
@noelicus - In Projekten, an denen ich bisher gearbeitet habe, habe ich ein periodisches Überwachungs- / Abfragesystem implementiert (einfache HTTP-GET-Anforderungen, weil ich auf einen Webserver abgezielt habe), das Ereignisse auslöst, wenn der Server als "ausgefallen" erkannt wird (nicht erreichbar) per HTTP) oder "up" (wieder erreichbar). Im allgemeinen Fall können Sie definieren, was "zuverlässig" in Ihrem Fall bedeutet, und eine ähnliche Logik implementieren.
Simon Mourier
9

Microsoft Windows Vista und 7 verwenden die NCSI-Technik (Network Connectivity Status Indicator):

  1. NCSI führt eine DNS-Suche auf www.msftncsi.com durch und fordert dann http://www.msftncsi.com/ncsi.txt an . Diese Datei ist eine Nur-Text-Datei und enthält nur den Text ' Microsoft NCSI '.
  2. NCSI sendet eine DNS-Suchanforderung für dns.msftncsi.com. Diese DNS-Adresse sollte in 131.107.255.255 aufgelöst werden. Wenn die Adresse nicht übereinstimmt, wird davon ausgegangen, dass die Internetverbindung nicht ordnungsgemäß funktioniert.
Saleh Rahimzadeh
quelle
3
Das ist großartig, aber technisch gesehen geht es nicht um die Verfügbarkeit eines "Netzwerks", sondern eher um "Habe ich eine Internetverbindung über http?" Sie können perfekte Netzwerkverbindungen haben, aber keine Verbindung zum Internet, beispielsweise auf einem eigenständigen LAN. Weitere Informationen finden Sie unter NCSI: technet.microsoft.com/en-us/library/cc766017.aspx
MichielB
1

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);
Kumar
quelle