compruebe si la conexión a Internet está disponible con C #

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

EDITAR: Tal como lo sugerí, traté de usar el siguiente método, pero siempre es cierto.

[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): accedo a internet a través de una red wifi compartida.

Aquí está 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 ) ; } } 

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

NCSI realiza una búsqueda DNS en http://www.msftncsi.com, luego 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.

Puede verificar una conexión de red usando esto en .NET 2.0+

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

Es probable que esto solo sea true para las redes locales, por lo que puede no funcionar para usted.

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 con un par de búsquedas DNS (consulte System.Net.Dns) para conocer los recursos que le interesan o algunos sitios web grandes 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 verificarlo, será más fácil proporcionar una respuesta que cubra sus necesidades …

aquí está 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 } 

La forma más sencilla es comprobar si pueden descargar un archivo de la web que sepa 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ías envolverlo en un Try …. Catch para atrapar la excepción que se lanza cuando no puede establecer una conexión.

Conciencia de la red en Windows XP

Conciencia de la red en Windows Vista y Windows 7

Por supuesto, esto no garantiza que el sitio web que planea visitar no esté bloqueado por reglas cooperativas de firewall, la API solo verifica si se puede acceder a un sitio web predefinido .

También hay algunas 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, según los documentos, creo que depende de algo así como PING, por lo que no necesariamente es una buena prueba.

Vista + diga usar el “Administrador de la lista de redes”

@colithium Google podría no estar inactivo, pero las cosas también pueden fallar si el intervalo de DNS lokup 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.

Alternativamente, puede usar la búsqueda 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; } }