2009-07-05 18 views
25

Qual è il modo più semplice per verificare se la connessione Internet è disponibile in modo programmatico?verificare se la connessione Internet è disponibile con C#

MODIFICA: Come suggerito, ho provato a utilizzare il seguente metodo, ma restituisce sempre 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(); 
} 
} 

Ulteriori informazioni (se aiuta): accesso a Internet su una rete Wi-Fi condivisa.

+1

Non sono sicuro di quale API lo gestisca, ma in Windows Vista e in alto verifica effettivamente la connessione a Internet. Sono sicuro che queste informazioni sono esposte in un'API, quindi se stai cercando una soluzione che funzioni meglio con Vista e il prossimo Windows 7, questa è l'API che vorresti, se tu o qualcun altro riusciste a capire quale è. – jasonh

+0

ne ho bisogno per funzionare con win 7 –

+0

Modificato la domanda che incorpora i risultati della soluzione suggerita. Non sta funzionando per me, per favore aiuto. Grazie! –

risposta

20

Here è l'API di Windows che è possibile chiamare. È in wininet.dll e chiamato 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

questo non compila –

+1

@colithium: 'ref' e' out' dovrebbero venire ** prima ** dichiarazione dei parametri. 'int out' non è valido. –

+1

@Michell: dovrebbe compilare ora. Ovviamente dovrai aggiungere un metodo 'Main'. –

4

Il modo più semplice è probabilmente verificare se è possibile scaricare un file dal Web che si sa è disponibile. Usa il seguente codice per scaricare la home page di google.

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

probabilmente si dovrebbe avvolgere che in un tentativo di cattura .... per intercettare l'eccezione che viene generata quando non è possibile stabilire una connessione.

+5

Ma cosa succede se Google non riesce? * Gasp * – colithium

+0

Poi avere una serie di grandi siti per testare contro ... – KristoferA

+0

Sembra molto dispendiosi ... –

7

È possibile verificare la presenza di una connessione di rete utilizzando questo .NET 2.0+

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

questo sarà probabilmente solo tornare true per le reti locali, in modo che non può funzionare per voi.

+1

MSDN: "Una connessione di rete è considerata disponibile se un'interfaccia di rete è contrassegnata come" up "e non è un'interfaccia loopback o tunnel." Quindi non garantisce che la connessione di rete sia una connessione a Internet. Comunque utile comunque. – colithium

+1

@colithium Ho aggiornato la mia risposta per riflettere questo. – mkchandler

0

Ci sono anche altre opzioni.

La libreria di InfoPath espone il metodo "IsDestinationReachable", che è un wrapper per il metodo API Win con lo stesso nome. (Sembra che Vista non lo supporti)

Tuttavia, credo che da Docs dipenda da qualcosa come PING, quindi non necessariamente un buon test.

Vista + dicono utilizzare il @colithium "Network List Manager"

Google potrebbe non essere giù, ma le cose possono anche fallire se l'intervallo lokup DNS supera il timeout. Non è raro a casa qui in Nuova Zelanda, prima prova fallisce, secondo succede perché i dati sono tornati al DNS dell'ISP o alla cache del router al momento in cui viene eseguita la seconda richiesta.

5

Questa è una domanda in cui la risposta è davvero "dipende". Perché dipende dal motivo per cui si desidera verificare e per quale tipo di connettività? Vuoi poter accedere a determinati siti Web/servizi tramite http? Invia mail smtp? Ricerca dns?

Utilizzare una combinazione delle risposte precedenti è probabilmente la strada da percorrere: prima utilizzare la wininet api dalla risposta del colite per verificare se è disponibile una connessione di qualsiasi tipo.

Se lo è, prova un paio di ricerche dns (vedi System.Net.Dns) per le risorse che ti interessano o alcuni grandi siti web popolari (google, altavista, compuserve, ecc ...).

Successivamente, è possibile provare il ping (vedere la risposta di Roger Willcocks) e/o stabilire una connessione socket agli stessi siti. Si noti che un ping fallito potrebbe semplicemente significare che le regole del firewall non consentono il ping.

Se si può essere più specifici sul motivo per cui si desidera controllare sarà più facile per fornire una risposta che copra le esigenze ...

+1

Penso che questo è dove tutte le nostre risposte stavano convergendo in modo +1 – colithium

7

qui è la soluzione migliore che ho trovato finora:

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; 
     } 

    } 

utilizzo:

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

Ma cosa succede se Google si dimentica di rinnovare la loro registrazione del dominio? ;) – ColinM

+0

Questo non funziona dietro un proxy, il GetInternetConnectedState non credo –

9

Microsoft Windows Vista e 7 uso NCSI (connettività di rete Indicatore di stato) tecnica:

NCSI esegue una ricerca DNS su www.msftncsi.com, quindi richiede http://www.msftncsi.com/ncsi.txt. Questo file è un file di solo testo e contiene solo il testo "Microsoft NCSI". NCSI invia una richiesta di ricerca DNS per dns.msftncsi.com. Questo indirizzo DNS dovrebbe risolversi in 131.107.255.255. Se l'indirizzo non corrisponde, si presume che la connessione Internet non funzioni correttamente.

+2

Questa è la migliore risposta qui. Mentre altre risposte semplicemente NON forniscono risultati accurati (in particolare System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) e altre risposte controllano solo il DNS (i server DNS potrebbero essere inattivo ma la connettività Internet è ancora disponibile) l'approccio NCSI verifica prima il DNS e se fallisce, prova a collegarsi direttamente tramite l'indirizzo IP in modo che possa determinare se la tua connessione Internet è davvero inattiva o il tuo DNS non funziona. Vedere http://technet.microsoft.com/en-us/library/ee126135%28v=WS.10%29.aspx –

0

In alternativa è possibile utilizzare la ricerca DNS per verificare la connettività Internet. Questo metodo è più veloce del metodo Ping.

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