2009-07-05 11 views
25

Jaki jest najłatwiejszy sposób sprawdzenia, czy połączenie internetowe jest dostępne programowo?sprawdź, czy połączenie internetowe jest dostępne z C#

EDYTOWANIE: Zgodnie z sugestią próbowałem użyć następującej metody, ale zawsze zwraca true.

[Flags] 
enum InternetConnectionState : int 
{ 
    INTERNET_CONNECTION_MODEM = 0x1, 
    INTERNET_CONNECTION_LAN = 0x2, 
    INTERNET_CONNECTION_PROXY = 0x4, 
    INTERNET_RAS_INSTALLED = 0x10, 
    INTERNET_CONNECTION_OFFLINE = 0x20, 
    INTERNET_CONNECTION_CONFIGURED = 0x40 
} 

class Program 
{ 
    [DllImport("WININET", CharSet = CharSet.Auto)] 
    static extern bool InternetGetConnectedState(ref InternetConnectionState lpdwFlags, int dwReserved); 

static void Main(string[] args) 
{ 
    InternetConnectionState flags = 0; 
    bool isConnected = InternetGetConnectedState(ref flags, 0); 
    Console.WriteLine(isConnected); 
    //Console.WriteLine(flags); 
    Console.ReadKey(); 
} 
} 

Dodatkowe informacje (jeśli to pomaga): Dostęp do Internetu przez udostępnioną sieć Wi-Fi.

+1

Nie jestem pewien, który interfejs API obsługuje, ale w systemie Windows Vista i nowszych faktycznie sprawdza połączenie z Internetem. Jestem pewien, że te informacje są ujawnione w interfejsie API, więc jeśli szukasz rozwiązania, które najlepiej działa pod Vistą i nadchodzącym Windows 7, to jest to API, którego będziesz potrzebować, jeśli ty lub ktoś inny może wymyślić który to jest. – jasonh

+0

Potrzebuję go do pracy z wygraną 7 –

+0

Edytowano pytanie zawierające wyniki sugerowanego rozwiązania. To nie działa dla mnie, proszę o pomoc. Dzięki! –

Odpowiedz

20

Here to interfejs API systemu Windows, do którego można zadzwonić. Jest w wininet.dll i nazywa się InternetGetConnectedState.

using System; 
using System.Runtime; 
using System.Runtime.InteropServices; 

public class InternetCS 
{ 
    //Creating the extern function... 
    [DllImport("wininet.dll")] 
    private extern static bool InternetGetConnectedState(out int Description, int ReservedValue); 

    //Creating a function that uses the API function... 
    public static bool IsConnectedToInternet() 
    { 
     int Desc ; 
     return InternetGetConnectedState(out Desc, 0) ; 
    } 
} 
+0

to nie kompiluje –

+1

@ lit: 'ref' i' out' powinny pochodzić ** przed ** deklaracją parametru. 'int out' jest nieprawidłowe. –

+1

@Michell: Powinno się teraz skompilować. Oczywiście musisz dodać metodę 'Main'. –

4

Najprostszym sposobem jest prawdopodobnie sprawdzenie, czy mogą pobrać plik z internetu, o którym wiadomo, że jest dostępny. Użyj poniższego kodu, aby pobrać stronę główną Google.

WebClient Client = new WebClient(); 
String Response; 
Response = Client.DownloadString("http://www.google.com"); 

Powinieneś prawdopodobnie zawinąć to w Try ... Catch, aby wychwycić wyjątek, który jest wyrzucany, gdy nie może nawiązać połączenia.

+5

Ale co, jeśli Google się nie powiedzie? * sapanie * – colithium

+0

Następnie masz zestaw dużych witryn do przetestowania przed ... – KristoferA

+0

Wygląda bardzo nieefektywne ... –

7

można sprawdzić za pomocą połączenia sieciowego przy użyciu tego w .NET 2.0+

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable(); 

Będzie to prawdopodobnie po prostu wrócić true dla sieci lokalnych, a więc nie może pracować dla Ciebie.

+1

MSDN: "Połączenie sieciowe jest uważane za dostępne, jeśli interfejs sieciowy jest oznaczony" w górę "i nie jest interfejsem pętli zwrotnej ani tunelem." Nie gwarantuje to, że połączenie sieciowe jest połączeniem z Internetem. Wciąż przydatne. – colithium

+1

@colithium Zaktualizowałem moją odpowiedź, aby to odzwierciedlić. – mkchandler

0

Jest kilka innych opcji.

Biblioteka biblioteki InfoPath udostępnia metodę "IsDestinationReachable", która jest opakowaniem dla metody Win API o tej samej nazwie. (Wygląda na to, że Vista go nie obsługuje)

Jednak wierzę z dokumentów, że zależy to od czegoś takiego jak PING, więc niekoniecznie dobry test.

Vista + powiedzieć użyć @colithium "Network List Manager"

Google może nie być w dół, ale rzeczy, które także nie, jeśli przerwa lokup DNS przekroczy limit czasu. Niezbyt często spotykane w domu w NZ, pierwsza próba kończy się niepowodzeniem, druga się powiodła, ponieważ dane zostały przekazane z powrotem do DNS ISP lub pamięci podręcznej routera do czasu wykonania drugiego żądania.

5

To jest pytanie, na które odpowiedź brzmi "to zależy". Ponieważ zależy to od tego, dlaczego chcesz sprawdzić i jakiego rodzaju połączenia? Czy chcesz mieć dostęp do pewnych witryn/usług przez http? Wysłać wiadomość smtp? Czy wyszukiwań dns?

Korzystanie z kombinacji poprzednich odpowiedzi jest prawdopodobnie drogą do zrobienia - najpierw użyj api wininet z odpowiedzi colithium, aby sprawdzić, czy dostępne jest jakiekolwiek połączenie.

Jeśli tak, spróbuj wykonać kilka wyszukiwań dns (patrz System.Net.Dns) dla zasobów, które Cię interesują, lub popularnych popularnych witryn (google, altavista, compuserve itp.).

Następnie możesz spróbować pingować (zobacz odpowiedź Roger Willcocks) i/lub ustanowić połączenie z gniazdem do tych samych witryn. Zauważ, że nieudane pingowanie może oznaczać, że reguły zapory nie pozwalają na pingowanie.

Czy można być bardziej szczegółowe, dlaczego chcesz sprawdzić łatwiej będzie udzielić odpowiedzi, która zakrywa swoje wymagania ...

+1

Myślę, że właśnie tutaj zbieżały się wszystkie nasze odpowiedzi, więc +1 – colithium

7

tutaj jest to najlepsze rozwiązanie znalazłem dotąd:

public static bool isConnected() 
    { 
     try 
     { 
      string myAddress = "www.google.com"; 
      IPAddress[] addresslist = Dns.GetHostAddresses(myAddress); 

      if (addresslist[0].ToString().Length > 6) 
      { 
       return true; 
      } 
      else 
       return false; 

     } 
     catch 
     { 
      return false; 
     } 

    } 

wykorzystanie:

if(isConnected()) 
{ 
    //im connected to the internet 
} 
else 
{ 
    //not connected 
} 
+0

Ale co, jeśli Google zapomni odnowić rejestrację swojej domeny? ;) – ColinM

+0

To nie działa za proxy, GetInternetConnectedState nie wierzę –

9

Microsoft Windows Vista i 7 wykorzystanie NCSI (wskaźnik stanu połączeń sieciowych) Technika:

NCSI wykonuje wyszukiwanie DNS www.msftncsi.com, a następnie żąda http://www.msftncsi.com/ncsi.txt. Ten plik jest plikiem tekstowym i zawiera tylko tekst "Microsoft NCSI". NCSI wysyła żądanie wyszukiwania DNS dla dns.msftncsi.com. Ten adres DNS powinien zostać przetłumaczony na 131.107.255.255. Jeśli adres nie jest zgodny, zakłada się, że połączenie internetowe nie działa poprawnie.

+2

To jest najlepsza odpowiedź tutaj. Podczas gdy inne odpowiedzi po prostu NIE dostarczają dokładnych wyników (zwłaszcza System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()), a inne odpowiedzi sprawdzają tylko DNS (twoje serwery DNS mogą być wyłączone, ale nadal masz połączenie z Internetem), podejście NCSI sprawdza najpierw DNS i jeśli to się nie powiedzie, próbuje połączyć się bezpośrednio za pomocą adresu IP, aby sprawdzić, czy twój internet rzeczywiście nie działa lub czy serwer DNS nie działa. Zobacz http://technet.microsoft.com/en-us/library/ee126135%28v=WS.10%29.aspx –

0

Można również użyć wyszukiwania DNS w celu sprawdzenia połączenia z Internetem. Ta metoda jest szybsza niż metoda Ping.

public static bool DnsTest() 
    { 
     try 
     { 
      System.Net.IPHostEntry ipHe = 
       System.Net.Dns.GetHostByName("www.google.com"); 
      return true; 
     } 
     catch 
     { 
      return false; 
     } 
    } 
Powiązane problemy