Jaki jest najszybszy i najskuteczniejszy sposób sprawdzenia łączności z Internetem w .NET?
c#
.net
internet-connection
Mohit Deshpande
źródło
źródło
Windows NLM API
powinno być najlepsze do tego. stackoverflow.com/questions/5405895/…Odpowiedzi:
Coś takiego powinno działać.
System.Net.WebClient
źródło
I cannot image a world where www.google.com does not return some HTML
w Chinach, na przykład ...Nie ma absolutnie żadnego sposobu na niezawodne sprawdzić, czy jest połączenie z Internetem, czy nie (zakładam, że masz na myśli dostęp do Internetu).
Możesz jednak poprosić o zasoby, które praktycznie nigdy nie są w trybie offline, takie jak pingowanie google.com lub coś podobnego. Myślę, że to byłoby skuteczne.
źródło
8.8.8.8
lub8.8.4.4
) działa dla mnie dobrze.Beware - many schools and offices block the ping protocol.
jeśli używasz tej metody do aplikacji, która będzie używana przez klientów, odradzam tę metodę sprawdzania InternetuZamiast sprawdzania, po prostu wykonaj akcję (żądanie sieciowe, poczta, ftp itp.) I przygotuj się na niepowodzenie żądania, co i tak musisz zrobić, nawet jeśli sprawdzenie się powiedzie.
Rozważ następujące:
Jeśli sieć nie działa, działanie zakończy się niepowodzeniem tak szybko, jak ping itp.
źródło
NetworkInterface.GetIsNetworkAvailable
jest bardzo zawodny. Wystarczy mieć jakieś VMware lub inne połączenie LAN, a ono zwróci zły wynik. Również oDns.GetHostEntry
metodę martwiłem się tylko, czy testowy adres URL może zostać zablokowany w środowisku, w którym moja aplikacja ma zostać wdrożona.Więc innym sposobem, który odkryłem, jest użycie
InternetGetConnectedState
metody. Mój kod toźródło
Test połączenia internetowego przez pingowanie Google:
źródło
Nie zgadzam się z osobami, które stwierdzają: „Po co sprawdzać łączność przed wykonaniem zadania, ponieważ natychmiast po sprawdzeniu połączenie może zostać utracone”. Z pewnością w wielu zadaniach programistycznych podejmujemy się, jako programiści, pewien stopień niepewności, ale ograniczanie niepewności do poziomu akceptacji jest częścią wyzwania.
Niedawno napotkałem ten problem podczas tworzenia aplikacji, która zawiera funkcję mapowania, która łączy się z serwerem kafelków on-line. Funkcjonalność ta miała zostać wyłączona tam, gdzie zauważono brak połączenia z Internetem.
Niektóre odpowiedzi na tej stronie były bardzo dobre, ale spowodowały jednak wiele problemów z wydajnością, takich jak zawieszanie się, głównie w przypadku braku łączności.
Oto rozwiązanie, z którego ostatecznie skorzystałem, korzystając z niektórych z tych odpowiedzi i moich kolegów:
źródło
Widziałem wszystkie opcje wymienione powyżej, a jedyną realną opcją sprawdzenia, czy internet jest dostępny, czy nie, jest opcja „ping”. Importowanie
[DllImport("Wininet.dll")]
i /System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
lub jakakolwiek inna odmianaNetworkInterface
klasy nie działa dobrze w wykrywaniu dostępności sieci. Te metody sprawdzają tylko, czy kabel sieciowy jest podłączony czy nie.„Opcja pingowania”
if
(Połączenie jest dostępne) zwracatrue
if
(Połączenie nie jest dostępne, a kabel sieciowy jest podłączony) powracafalse
if
(Kabel sieciowy nie jest podłączony)Throws an exception
Interfejs sieciowy
if
(Internet jest dostępny) ZwracaTrue
if
(Internet nie jest dostępny, a kabel sieciowy jest podłączony) ZwracaTrue
if
Zwraca komunikat (Kabel sieciowy nie jest podłączony)false
[DllImport („Wininet.dll”)]
if
(Internet jest dostępny) ZwracaTrue
if
(Internet nie jest dostępny, a kabel sieciowy jest podłączony) ZwracaTrue
if
Zwraca komunikat (Kabel sieciowy nie jest podłączony)false
Tak więc w przypadku
[DllImport("Wininet.dll")]
iNetworkInterface
Nie ma możliwości sprawdzenia, czy połączenie internetowe jest dostępne.źródło
Nie rozwiązuje problemu awarii sieci między sprawdzaniem a uruchamianiem kodu, ale jest dość niezawodny
źródło
Pinging google.com wprowadza zależność od rozpoznawania nazw DNS. Pingowanie 8.8.8.8 jest w porządku, ale Google jest o kilka kroków ode mnie. Wszystko, co muszę zrobić, to pingować najbliższą rzecz do mnie, która jest w Internecie.
Mogę używać funkcji Ping TTL do pingowania przeskoku 1, następnie przeskoku 2 itd., Dopóki nie otrzymam odpowiedzi z czegoś, co znajduje się na adresie routowalnym; jeśli ten węzeł znajduje się na routowalnym adresie, to znajduje się w Internecie. Dla większości z nas przeskakiwanie nr 1 będzie naszą lokalną bramą / routerem, a przeskakiwanie nr 2 będzie pierwszym punktem po drugiej stronie naszego połączenia światłowodowego.
Ten kod działa dla mnie i reaguje szybciej niż niektóre inne sugestie w tym wątku, ponieważ pinguje wszystko, co jest najbliżej mnie w Internecie.
źródło
Oto jak jest zaimplementowany w systemie Android.
Jako dowód koncepcji przetłumaczyłem ten kod na C #:
źródło
źródło
Inną opcją jest interfejs API Network List Manager, który jest dostępny dla systemów Vista i Windows 7. Artykuł MSDN tutaj . W artykule znajduje się link do pobierania próbek kodu, które pozwalają to zrobić:
Pamiętaj, aby dodać odwołanie do Listy typów sieci Lista 1.0 z zakładki COM ..., która pojawi się jako LISTA SIECI.
źródło
Staraj się unikać testowania połączeń, wychwytując wyjątek. ponieważ naprawdę oczekujemy, że czasami możemy utracić połączenie sieciowe.
źródło
Jeśli chcesz powiadomić użytkownika / podjąć działania za każdym razem, gdy nastąpi zmiana sieci / połączenia.
Użyj interfejsu 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
źródło
Osobiście najlepiej znajduję odpowiedź Antona i moffeltje , ale dodałem zaznaczenie, aby wykluczyć sieci wirtualne skonfigurowane przez VMWare i inne.
źródło
źródło
bb
że nadal byłby prawdziwy, nawet gdy sieć nie jest połączona z Internetem.Wielowątkowa wersja ping:
źródło
Nie sądziłbym, że to niemożliwe, po prostu nie proste.
Zbudowałem coś takiego i tak, to nie jest idealne, ale pierwszy krok jest niezbędny: sprawdzić, czy jest jakaś łączność sieciowa. Interfejs API systemu Windows nie wykonuje dobrej roboty, więc dlaczego nie zrobić lepszej pracy?
Jest to dość proste, ale naprawdę pomaga poprawić jakość kontroli, szczególnie gdy chcesz sprawdzić różne konfiguracje proxy.
Więc:
źródło
źródło
Użyj NetworkMonitor do monitorowania stanu sieci i połączenia internetowego.
Próba:
źródło
Wprowadzenie
W niektórych scenariuszach musisz sprawdzić, czy internet jest dostępny, czy nie używa kodu C # w aplikacjach Windows. Może być pobranie lub przesłanie pliku przez Internet w formularzach systemu Windows lub pobranie danych z bazy danych, która znajduje się w zdalnej lokalizacji, w takich sytuacjach sprawdzenie Internetu jest obowiązkowe.
Istnieje kilka sposobów sprawdzenia dostępności Internetu za pomocą kodu C # z tyłu kodu. Wszystkie takie sposoby są wyjaśnione tutaj, w tym ich ograniczenia.
Interfejs API „wininet” może służyć do sprawdzania, czy system lokalny ma aktywne połączenie z Internetem, czy nie. Przestrzeń nazw użyta do tego to „System.Runtime.InteropServices” i zaimportuj dll „wininet.dll” za pomocą DllImport. Następnie utwórz zmienną boolowską ze statyczną zewnętrzną o nazwie funkcji InternetGetConnectedState z opisem dwóch parametrów i zastrzeżoną wartością, jak pokazano w przykładzie.
Uwaga: Modyfikator zewnętrzny służy do deklarowania metody zaimplementowanej zewnętrznie. Typowym zastosowaniem zewnętrznego modyfikatora jest atrybut DllImport, gdy używasz usług Interop do wywoływania kodu niezarządzanego. W takim przypadku metodę należy również zadeklarować jako statyczną.
W poniższym przykładzie użyto metody GetIsNetworkAvailable do ustalenia, czy połączenie sieciowe jest dostępne.
Uwagi (zgodnie z MSDN): Połączenie sieciowe jest uważane za dostępne, jeśli jakikolwiek interfejs sieciowy jest oznaczony jako „up” i nie jest interfejsem pętli zwrotnej ani tunelowania.
Istnieje wiele przypadków, w których urządzenie lub komputer nie jest podłączone do użytecznej sieci, ale nadal jest uważane za dostępne, a GetIsNetworkAvailable zwróci wartość true. Na przykład, jeśli urządzenie z uruchomioną aplikacją jest podłączone do sieci bezprzewodowej, która wymaga serwera proxy, ale serwer proxy nie jest ustawiony, GetIsNetworkAvailable zwróci wartość true. Innym przykładem, gdy GetIsNetworkAvailable zwróci wartość true, jest aplikacja działająca na komputerze podłączonym do koncentratora lub routera, w którym koncentrator lub router utracił połączenie nadrzędne.
Klasy Ping i PingReply pozwalają aplikacji ustalić, czy komputer zdalny jest dostępny przez sieć, otrzymując odpowiedź od hosta. Te klasy są dostępne w przestrzeni nazw System.Net.NetworkInformation. Poniższy przykład pokazuje, jak wysłać polecenie ping do hosta.
Uwagi (zgodnie z MSDN): Aplikacje używają klasy Ping do wykrywania, czy komputer zdalny jest osiągalny. Topologia sieci może określić, czy Ping może pomyślnie skontaktować się ze zdalnym hostem. Obecność i konfiguracja serwerów proxy, sprzętu do translacji adresów sieciowych (NAT) lub zapór ogniowych może uniemożliwić działanie Pinga. Pomyślny ping wskazuje tylko, że zdalny host jest dostępny w sieci; obecność usług wyższego poziomu (takich jak serwer WWW) na zdalnym hoście nie jest gwarantowana.
Komentarze / sugestie są zaproszone. Miłego kodowania ......!
źródło
W przypadku mojej aplikacji testujemy również, pobierając niewielki plik.
Również. Niektórzy usługodawcy internetowi mogą używać środkowego serwera do buforowania pliku. Dodaj losowy nieużywany parametr np. https://www.microsoft.com/favicon.ico?req=random_number Może zapobiec buforowaniu.
źródło
Mam problem z tą metodą na moim routerze / modemie 3g, ponieważ jeśli Internet jest odłączony, router przekierowuje stronę na stronę z odpowiedzią, więc nadal dostajesz parę i twój kod myśli, że jest internet. Jabłka (lub inne) mają stronę dedykowaną, która zawsze zwraca określoną odpowiedź. Poniższy przykład zwraca odpowiedź „Sukces”. Dzięki temu będziesz mieć pewność, że możesz połączyć się z Internetem i uzyskać prawdziwą odpowiedź!
źródło
Mam trzy testy połączenia z Internetem.
System.Net
iSystem.Net.Sockets
Test 1
Test 2
Test 3
Przeprowadzanie testów
Jeśli się
Dictionary
zString
iBoolean
nazywaCheckList
, można dodać wyniki testu dla każdegoCheckList
.Teraz przejrzyj każdą
KeyValuePair
z nich za pomocąfor...each
pętli.Jeśli
CheckList
zawieraValue
odtrue
, wtedy wiesz, że istnieje połączenie z Internetem.źródło
To działa
źródło