Como detectar internet en aplicaciones Windows y Web

Hoy en dia podemos concebir nuestra vida sin internet? Yo creo que no. Las aplicaciones que escribimos mas y mas asumen que estaremos conectados continuamente a Internet. Pero hay escenarios donde aun no podemos garantizar una conexion permanente a Internet: zonas rurales o caidas de la infraestructura de red de nuestro proveedor. En paises como el mio tambien el no tener internet puede considerarse bastante comun. En cualquier caso determinar si estoy conectado a internet es practicamente un requisito implicito para las aplicaciones que escribimos hoy y en muchos foros y listas de discusion se pregunta lo mismo y hay varias respuestas. Pero aqui les mostrare la respuesta oficial de Microsoft y mi propia implementacion Smile

La idea y el gran “secreto” es usar el NCSI de Microsoft (Network Connectivity Status Indicator) tal como se explica en este articulo.

En el articulo encontraran que la parte mas importante es esta (al menos para mi):

Type of Request that NCSI Sends What NCSI Expects to Receives if Connectivity Exists
A request for http://www.msftncsi.com/ncsi.txt

Page called ncsi.txt containing the following line of text with no terminating new line or other non-printing characters:

Microsoft NCSI

(Page headers disable caching.)

A request for DNS name resolution ofdns.msftncsi.com

Resolution of the DNS name to: 131.107.255.255

Bueno aqui mi implementacion, agregando una validacion adicional, que el/los adaptadores de red esten habilitados, probablemente es redundante pero….

1 public bool IsInternetConnected() 2 { 3 //Stopwatch clock = new Stopwatch(); 4 //clock.Start(); 5 6 var isNetworkAvailable = IsNetworkAvailable(); 7 if (!isNetworkAvailable) return false; 8 var ncsiRequest = IsNCSIConnected(); 9 var dnsLookupNCSIResolved = IsDnsLookupResolved(); 10 11 //clock.Stop(); 12 //Debug.WriteLine("Time elapsed " + clock.ElapsedMilliseconds + " milliseconds"); 13 //Console.WriteLine("Time elapsed " + clock.ElapsedMilliseconds + " milliseconds"); 14 //Debug.WriteLine("Time elapsed " + clock.ElapsedMilliseconds / 1000 + " seconds"); 15 //Console.WriteLine("Time elapsed " + clock.ElapsedMilliseconds / 1000 + " seconds"); 16 if (ncsiRequest || (!ncsiRequest && dnsLookupNCSIResolved)) return true; 17 return false; 18 }

El codigo comentado lo dejo ahi porque yo lo use para hacer mediciones de tiempos y tambien por si en algun momento ustedes necesitan hacerlas.

1 private bool IsNetworkAvailable(long minimumSpeed=0) 2 { 3 if (!NetworkInterface.GetIsNetworkAvailable()) 4 return false; 5 6 foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces()) 7 { 8 // se descartan los elementos por razones estandar 9 if ((ni.OperationalStatus != OperationalStatus.Up) || 10 (ni.NetworkInterfaceType == NetworkInterfaceType.Loopback) || 11 (ni.NetworkInterfaceType == NetworkInterfaceType.Tunnel)) 12 continue; 13 14 // Se filtran modems, puertos seriales y cosas por el estilo 15 // se utiliza 10000000 como un minimo de velocidad para la mayoria de los casos 16 if (ni.Speed < minimumSpeed) 17 continue; 18 19 // Se descarta nic virtuales (vmware, virtual box, virtual pc, etc.) 20 if ((ni.Description.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0) || 21 (ni.Name.IndexOf("virtual", StringComparison.OrdinalIgnoreCase) >= 0)) 22 continue; 23 24 return true; 25 } 26 return false; 27 }

El metodo parece demasiado rebuscado pero tiene excelentes consideraciones.

1 public bool IsNCSIConnected() 2 { 3 try 4 { 5 HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.msftncsi.com/ncsi.txt"); 6 HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 7 return response.StatusCode == HttpStatusCode.OK; 8 } 9 catch (Exception) 10 { 11 return false; 12 } 13 }

El metodo valida que se haya obtenido un codigo 200 como respuesta, no recupero el contenido del archivo consultado.

Finalmente verifico que se este resolviendo correctamente el DNS, todo para seguir el algoritmo propuesto por Microsoft.

Espero que les sea de utilidad, en una siguiente entrada mostrare el metodo de detectar internet pero en Windows Phone.

Saludos.

Un comentario en “Como detectar internet en aplicaciones Windows y Web

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *