2009-07-05 21 views
25

¿Cuál es la forma más fácil de verificar si la conexión a Internet está disponible programáticamente?compruebe si la conexión a Internet está disponible con C#

EDIT: Como se sugirió intenté usar el siguiente método, pero siempre es verdadero.

[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(); 
} 
} 

Información adicional (si ayuda): puedo acceder a Internet a través de una red Wi-Fi compartido.

+1

No estoy seguro de qué API lo maneja, pero en Windows Vista y hasta realmente verifica su conexión a Internet. Estoy seguro de que esta información está expuesta en una API, por lo que si está buscando una solución que funcione mejor con Vista y la próxima versión de Windows 7, esa es la API que va a querer, si usted o alguien más puede resolverlo cuál es. – jasonh

+0

lo necesito para trabajar con win 7 –

+0

Edité la pregunta incorporando los resultados de la solución sugerida. No funciona para mí por favor ayuda. ¡Gracias! –

Respuesta

20

Here es la API de Windows a la que puede llamar. Está en wininet.dll y se llama 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

esto no compila –

+1

@colithium: 'ref' y' out' deberían venir ** antes de ** declaración de parámetro. 'int out' no es válido. –

+1

@Michell: Debería compilarse ahora. Por supuesto, tendrá que agregar un método 'Principal'. –

4

La manera más fácil es probablemente comprobar si pueden descargar un archivo de la web que sabe que está disponible. Use el siguiente código para descargar la página de inicio de google.

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

probablemente debería concluir que en un intento de captura .... para detectar la excepción que se inicia cuando no se puede establecer una conexión.

+5

¿Pero qué pasa si Google falla? * gasp * – colithium

+0

Luego tiene un conjunto de sitios grandes para probar ... – KristoferA

+0

Parece un desperdicio ... –

7

Puede comprobar si hay una conexión de red utilizando esto en .NET 2.0+

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

Esta será probablemente sólo volver true para redes locales, por lo que no puede trabajar para usted.

+1

MSDN: "Se considera que una conexión de red está disponible si cualquier interfaz de red está marcada como" activada "y no es una interfaz de bucle o túnel." Por lo tanto, no garantiza que la conexión de red sea una conexión a Internet. Aún así útil. – colithium

+1

@colithium Actualicé mi respuesta para reflejar eso. – mkchandler

0

También hay otras opciones.

La biblioteca de InfoPath expone el método "IsDestinationReachable", que es un contenedor para el método Win API del mismo nombre. (Parece que Vista no lo admite)

Sin embargo, creo por los documentos que depende de algo así como PING, por lo que no necesariamente es una buena prueba.

Vista + dicen utilizar el @colithium "Network List Manager"

Google podría no estar abajo, pero las cosas también puede fallar si el intervalo lokup DNS excede el tiempo de espera. No es raro en casa aquí en Nueva Zelanda, la primera prueba falla, el segundo tiene éxito porque los datos se han propagado nuevamente al DNS del ISP o al caché de su enrutador para cuando se realiza la segunda solicitud.

5

Esta es una pregunta donde la respuesta es realmente "depende". Porque depende de por qué quieres verificar y de qué tipo de conectividad? ¿Desea poder acceder a ciertos sitios web/servicios a través de http? ¿Enviar correo smtp? ¿Busca DNS?

Usar una combinación de las respuestas anteriores es probablemente el camino a seguir: primero use la API de wininet de la respuesta de colithium para verificar si hay alguna conexión disponible.

Si es así, intente un par de búsquedas dns (consulte System.Net.Dns) ya sea para los recursos que le interesan o para algunos de los sitios web más populares (google, altavista, compuserve, etc.).

A continuación, puede intentar hacer ping (ver la respuesta de Roger Willcocks) y/o establecer una conexión de socket a los mismos sitios. Tenga en cuenta que un ping fallido podría significar que las reglas del firewall no le permiten hacer ping.

Si puede ser más específico en cuanto a por qué desea comprobar que será más fácil para proporcionar una respuesta que cubre sus necesidades ...

+1

Creo que aquí es donde todas nuestras respuestas convergían, así que +1 – colithium

7

Aquí es la mejor solución que encontré hasta ahora:

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

    } 

uso:

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

¿Pero qué ocurre si Google olvida renovar su registro de dominio? ;) – ColinM

+0

Esto no funciona detrás de un proxy, el GetInternetConnectedState creo –

9

Microsoft Windows Vista y 7 uso NCSI (conectividad de red Indicador de estado) técnica:

NCSI realiza una búsqueda de DNS en www.msftncsi.com, a continuación, solicita http://www.msftncsi.com/ncsi.txt. Este archivo es un archivo de texto plano y contiene solo el texto 'Microsoft NCSI'. NCSI envía una solicitud de búsqueda de DNS para dns.msftncsi.com. Esta dirección DNS debe resolverse a 131.107.255.255. Si la dirección no coincide, se supone que la conexión a Internet no funciona correctamente.

+2

Esta es la mejor respuesta aquí. Mientras que otras respuestas simplemente NO proporcionan resultados precisos (especialmente System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()) y otras respuestas solo revisan DNS (sus servidores DNS podrían estar caídos pero todavía tiene conectividad a Internet) el enfoque NCSI verifica primero DNS y si eso falla, entonces intenta conectarse directamente a través de la dirección IP para que pueda determinar si su internet está realmente inactivo o si su DNS está inactivo. Ver http://technet.microsoft.com/en-us/library/ee126135%28v=WS.10%29.aspx –

0

Alternativamente, puede usar la búsqueda de DNS para verificar la conectividad a Internet. Este método es más rápido que el método Ping.

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