Was ist der schnellste und effizienteste Weg, um die Internetverbindung in .NET zu überprüfen?
c#
.net
internet-connection
Mohit Deshpande
quelle
quelle
Windows NLM API
sollte das Beste dafür sein. stackoverflow.com/questions/5405895/…Antworten:
So etwas sollte funktionieren.
System.Net.WebClient
quelle
I cannot image a world where www.google.com does not return some HTML
in China zum Beispiel ...Es gibt absolut keine Möglichkeit, zuverlässig zu überprüfen, ob eine Internetverbindung besteht oder nicht (ich nehme an, Sie meinen den Zugang zum Internet).
Sie können jedoch Ressourcen anfordern, die praktisch nie offline sind, z. B. Ping an google.com oder ähnliches. Ich denke, das wäre effizient.
quelle
8.8.8.8
oder8.8.4.4
) von Google funktioniert für mich einwandfrei .Beware - many schools and offices block the ping protocol.
ich , wenn Sie diese Methode für eine Anwendung verwenden, die von Kunden verwendet wird, von dieser Methode zur Überprüfung des Internets abraten würdeAnstatt zu prüfen, führen Sie einfach die Aktion aus (Webanforderung, E-Mail, FTP usw.) und bereiten Sie sich darauf vor, dass die Anforderung fehlschlägt. Dies müssen Sie trotzdem tun, auch wenn Ihre Prüfung erfolgreich war.
Folgendes berücksichtigen:
Wenn das Netzwerk ausgefallen ist, schlägt Ihre Aktion genauso schnell fehl wie ein Ping usw.
quelle
NetworkInterface.GetIsNetworkAvailable
ist sehr unzuverlässig. Haben Sie nur eine VMware- oder eine andere LAN-Verbindung und es wird ein falsches Ergebnis zurückgegeben. Auch über dieDns.GetHostEntry
Methode war ich nur besorgt darüber, ob die Test-URL in der Umgebung, in der meine Anwendung bereitgestellt werden soll, blockiert sein könnte.Ein anderer Weg, den ich herausgefunden habe, ist die Verwendung der
InternetGetConnectedState
Methode. Mein Code istquelle
Ein Test für die Internetverbindung durch Ping von Google:
quelle
Ich bin nicht einverstanden mit Leuten, die sagen: "Was bringt es, vor dem Ausführen einer Aufgabe auf Konnektivität zu prüfen, da die Verbindung unmittelbar nach der Prüfung möglicherweise unterbrochen wird?" Sicherlich gibt es bei vielen Programmieraufgaben, die wir als Entwickler übernehmen, ein gewisses Maß an Unsicherheit, aber die Reduzierung der Unsicherheit auf ein Maß an Akzeptanz ist Teil der Herausforderung.
Ich bin kürzlich auf dieses Problem gestoßen, als ich eine Anwendung erstellt habe, die eine Zuordnungsfunktion enthält, die mit einem Online-Kachelserver verknüpft ist. Diese Funktionalität sollte deaktiviert werden, wenn ein Mangel an Internetverbindung festgestellt wurde.
Einige der Antworten auf dieser Seite waren sehr gut, verursachten jedoch viele Leistungsprobleme wie das Aufhängen, hauptsächlich im Falle fehlender Konnektivität.
Hier ist die Lösung, die ich mithilfe einiger dieser Antworten und meiner Kollegen verwendet habe:
quelle
Ich habe alle oben aufgeführten Optionen gesehen und die einzige praktikable Option, um zu überprüfen, ob das Internet verfügbar ist oder nicht, ist die Option "Ping". Das Importieren
[DllImport("Wininet.dll")]
und /System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
oder eine andere Variante derNetworkInterface
Klasse funktioniert nicht gut, um die Verfügbarkeit des Netzwerks zu ermitteln. Diese Methoden prüfen nur, ob das Netzwerkkabel eingesteckt ist oder nicht.Die "Ping-Option"
if
(Verbindung ist verfügbar) wird zurückgegebentrue
if
(Verbindung ist nicht verfügbar und das Netzwerkkabel ist eingesteckt) kehrt zurückfalse
if
(Netzwerkkabel ist nicht eingesteckt)Throws an exception
Das NetworkInterface
if
(Internet ist verfügbar) RückgabeTrue
if
(Internet ist nicht verfügbar und Netzwerkkabel ist eingesteckt) RückgabeTrue
if
(Netzwerkkabel ist nicht eingesteckt) wird zurückgegebenfalse
Der [DllImport ("Wininet.dll")]
if
(Internet ist verfügbar) RückgabeTrue
if
(Internet ist nicht verfügbar und Netzwerkkabel ist eingesteckt) RückgabeTrue
if
(Netzwerkkabel ist nicht eingesteckt) wird zurückgegebenfalse
Im Falle von
[DllImport("Wininet.dll")]
undNetworkInterface
Es gibt keine Möglichkeit zu wissen, ob eine Internetverbindung verfügbar ist.quelle
Löst nicht das Problem, dass das Netzwerk zwischen dem Überprüfen und Ausführen Ihres Codes ausfällt, ist aber ziemlich zuverlässig
quelle
Durch Ping von google.com wird eine Abhängigkeit von der DNS-Auflösung eingeführt. Ping 8.8.8.8 ist in Ordnung, aber Google ist einige Sprünge von mir entfernt. Alles, was ich tun muss, ist, das nächstgelegene im Internet zu pingen.
Ich kann die TTL-Funktion von Ping verwenden, um Hop Nr. 1, dann Hop Nr. 2 usw. zu pingen, bis ich eine Antwort von etwas erhalte, das sich an einer routbaren Adresse befindet. Wenn sich dieser Knoten an einer routbaren Adresse befindet, befindet er sich im Internet. Für die meisten von uns ist Hop Nr. 1 unser lokales Gateway / Router, und Hop Nr. 2 ist der erste Punkt auf der anderen Seite unserer Glasfaserverbindung oder was auch immer.
Dieser Code funktioniert für mich und reagiert schneller als einige der anderen Vorschläge in diesem Thread, da er im Internet pingt, was mir am nächsten ist.
quelle
So wird es in Android implementiert.
Als Proof of Concept habe ich diesen Code in C # übersetzt:
quelle
quelle
Eine weitere Option ist die Network List Manager-API, die für Vista und Windows 7 verfügbar ist. MSDN-Artikel hier . In diesem Artikel finden Sie einen Link zum Herunterladen von Codebeispielen, mit denen Sie Folgendes tun können:
Stellen Sie sicher, dass Sie auf der Registerkarte COM einen Verweis auf Network List 1.0 Type Library hinzufügen, der als NETWORKLIST angezeigt wird.
quelle
Vermeiden Sie das Testen von Verbindungen, indem Sie die Ausnahme abfangen. weil wir wirklich erwarten, dass wir manchmal die Netzwerkverbindung verlieren können.
quelle
Wenn Sie den Benutzer benachrichtigen / Maßnahmen ergreifen möchten, wenn eine Netzwerk- / Verbindungsänderung auftritt.
Verwenden Sie die NLM-API:
https://msdn.microsoft.com/en-us/library/ee264321.aspx
http://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
quelle
Ich persönlich finde die Antwort von Anton und moffeltje am besten, aber ich habe eine Überprüfung hinzugefügt, um virtuelle Netzwerke auszuschließen, die von VMWare und anderen eingerichtet wurden.
quelle
quelle
bb
dies auch dann der Fall ist, wenn das Netzwerk nicht mit dem Internet verbunden ist.Multithread-Version von Ping:
quelle
Ich würde nicht denken, dass es unmöglich ist, nur nicht einfach.
Ich habe so etwas gebaut, und ja, es ist nicht perfekt, aber der erste Schritt ist wichtig: zu überprüfen, ob es eine Netzwerkverbindung gibt. Die Windows-API macht keinen großartigen Job. Warum also nicht einen besseren Job machen?
Es ist ziemlich einfach, aber es hilft wirklich, die Qualität der Prüfung zu verbessern, insbesondere wenn Sie verschiedene Proxy-Konfigurationen überprüfen möchten.
So:
quelle
quelle
Verwenden Sie NetworkMonitor, um den Netzwerkstatus und die Internetverbindung zu überwachen.
Stichprobe:
quelle
Einführung
In einigen Szenarien müssen Sie mithilfe von C # -Code in Windows-Anwendungen überprüfen, ob das Internet verfügbar ist oder nicht. In diesen Situationen ist es möglicherweise obligatorisch, eine Datei über das Internet in Windows-Formularen herunterzuladen oder hochzuladen oder Daten aus einer Datenbank abzurufen, die sich an einem entfernten Standort befindet.
Es gibt einige Möglichkeiten, die Internetverfügbarkeit mithilfe von C # anhand des dahinter stehenden Codes zu überprüfen. Alle diese Möglichkeiten werden hier einschließlich ihrer Einschränkungen erläutert.
Mit der 'wininet'-API kann überprüft werden, ob das lokale System über eine aktive Internetverbindung verfügt oder nicht. Der dafür verwendete Namespace ist 'System.Runtime.InteropServices' und importiert die DLL 'wininet.dll' mit DllImport. Erstellen Sie anschließend eine boolesche Variable mit extern static mit dem Funktionsnamen InternetGetConnectedState mit zwei Parameter description und reservedValue, wie im Beispiel gezeigt.
Hinweis: Der Modifikator extern wird verwendet, um eine extern implementierte Methode zu deklarieren. Der externe Modifikator wird häufig mit dem DllImport-Attribut verwendet, wenn Sie Interop-Dienste zum Aufrufen von nicht verwaltetem Code verwenden. In diesem Fall muss die Methode auch als statisch deklariert werden.
Im folgenden Beispiel wird mithilfe der GetIsNetworkAvailable-Methode ermittelt, ob eine Netzwerkverbindung verfügbar ist.
Anmerkungen (gemäß MSDN): Eine Netzwerkverbindung gilt als verfügbar, wenn eine Netzwerkschnittstelle als "up" markiert ist und keine Loopback- oder Tunnelschnittstelle ist.
Es gibt viele Fälle, in denen ein Gerät oder Computer nicht mit einem nützlichen Netzwerk verbunden ist, aber dennoch als verfügbar angesehen wird und GetIsNetworkAvailable true zurückgibt. Wenn beispielsweise das Gerät, auf dem die Anwendung ausgeführt wird, mit einem drahtlosen Netzwerk verbunden ist, für das ein Proxy erforderlich ist, der Proxy jedoch nicht festgelegt ist, gibt GetIsNetworkAvailable true zurück. Ein weiteres Beispiel dafür, wann GetIsNetworkAvailable true zurückgibt, ist, wenn die Anwendung auf einem Computer ausgeführt wird, der mit einem Hub oder Router verbunden ist, auf dem der Hub oder Router die Upstream-Verbindung verloren hat.
Mit den Klassen Ping und PingReply kann eine Anwendung ermitteln, ob auf einen Remotecomputer über das Netzwerk zugegriffen werden kann, indem sie eine Antwort vom Host erhält. Diese Klassen sind im System.Net.NetworkInformation-Namespace verfügbar. Das folgende Beispiel zeigt, wie Sie einen Host anpingen.
Anmerkungen (gemäß MSDN): Anwendungen verwenden die Ping-Klasse, um festzustellen, ob ein Remotecomputer erreichbar ist. Die Netzwerktopologie kann bestimmen, ob Ping erfolgreich einen Remote-Host kontaktieren kann. Das Vorhandensein und die Konfiguration von Proxys, NAT-Geräten (Network Address Translation) oder Firewalls kann den Erfolg von Ping verhindern. Ein erfolgreicher Ping zeigt nur an, dass der Remote-Host im Netzwerk erreichbar ist. Das Vorhandensein von Diensten höherer Ebene (z. B. eines Webservers) auf dem Remote-Host kann nicht garantiert werden.
Kommentare / Vorschläge sind eingeladen. Viel Spaß beim Codieren ......!
quelle
Für meine Anwendung testen wir auch per Download winzige Datei.
Ebenfalls. Einige ISPs verwenden möglicherweise den mittleren Server, um Dateien zwischenzuspeichern. Fügen Sie zufällige nicht verwendete Parameter hinzu, z. https://www.microsoft.com/favicon.ico?req=random_number Kann das Caching verhindern.
quelle
Ich habe Probleme mit dieser Methode auf meinem 3G-Router / Modem, da der Router die Seite auf die Antwortseite umleitet, wenn das Internet nicht verbunden ist, sodass Sie immer noch Dampf bekommen und Ihr Code denkt, dass es Internet gibt. Äpfel (oder andere) haben eine Hot-Spot-Seite, die immer eine bestimmte Antwort zurückgibt. Das folgende Beispiel gibt die Antwort "Erfolg" zurück. Sie werden also genau sicher sein, dass Sie eine Verbindung zum Internet herstellen und eine echte Antwort erhalten können!
quelle
Ich habe drei Tests für eine Internetverbindung.
System.Net
undSystem.Net.Sockets
Test 1
Test 2
Test 3
Durchführen der Tests
Wenn Sie ein
Dictionary
von erstellenString
undBoolean
aufrufenCheckList
, können Sie die Ergebnisse jedes Tests hinzufügenCheckList
.Führen Sie nun jede Schleife
KeyValuePair
mit einerfor...each
Schleife durch.Wenn
CheckList
einValue
von enthälttrue
, wissen Sie, dass eine Internetverbindung besteht.quelle
Das funktioniert
quelle