¿Cuál es la forma más rápida y eficiente de verificar la conectividad a Internet en .NET?
c#
.net
internet-connection
Mohit Deshpande
fuente
fuente
Windows NLM API
debería ser lo mejor para esto. stackoverflow.com/questions/5405895/…Respuestas:
Algo como esto debería funcionar.
System.Net.WebClient
fuente
I cannot image a world where www.google.com does not return some HTML
en China, por ejemplo ...No hay absolutamente ninguna manera de que pueda verificar de manera confiable si hay una conexión a Internet o no (supongo que se refiere al acceso a Internet).
Sin embargo, puede solicitar recursos que prácticamente nunca están fuera de línea, como hacer ping a google.com o algo similar. Creo que esto sería eficiente.
fuente
8.8.8.8
o8.8.4.4
) funciona bien para mí.Beware - many schools and offices block the ping protocol.
si está utilizando este método para una aplicación que será utilizada por clientes, desaconsejaría este método de verificación de InternetEn lugar de verificar, simplemente realice la acción (solicitud web, correo, ftp, etc.) y esté preparado para que la solicitud falle, lo que debe hacer de todos modos, incluso si su verificación fue exitosa.
Considera lo siguiente:
Si la red está inactiva, su acción fallará tan rápido como un ping, etc.
fuente
NetworkInterface.GetIsNetworkAvailable
Es muy poco confiable. Solo tenga un poco de VMware u otra conexión LAN y obtendrá un resultado incorrecto. También sobre elDns.GetHostEntry
método, me preocupaba si la URL de prueba podría estar bloqueada en el entorno donde se implementará mi aplicación.Entonces, otra forma que descubrí es usando el
InternetGetConnectedState
método. Mi código esfuente
Una prueba de conexión a Internet haciendo ping a Google:
fuente
No estoy de acuerdo con las personas que dicen: "¿Cuál es el punto de verificar la conectividad antes de realizar una tarea, ya que inmediatamente después de la verificación se puede perder la conexión". Seguramente hay un cierto grado de incertidumbre en muchas tareas de programación que nosotros, como desarrolladores, emprendemos, pero reducir la incertidumbre a un nivel de aceptación es parte del desafío.
Recientemente me encontré con este problema al crear una aplicación que incluye una función de mapeo que se vincula a un servidor de mosaico en línea. Esta funcionalidad se deshabilitaría cuando se observara una falta de conectividad a Internet.
Algunas de las respuestas en esta página fueron muy buenas, pero sin embargo causaron muchos problemas de rendimiento, como el bloqueo, principalmente en el caso de la falta de conectividad.
Aquí está la solución que terminé usando, con la ayuda de algunas de estas respuestas y mis colegas:
fuente
He visto todas las opciones enumeradas anteriormente y la única opción viable para verificar si Internet está disponible o no es la opción "Ping". Importación
[DllImport("Wininet.dll")]
ySystem.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces()
O cualquier otra variación de laNetworkInterface
clase no funcionar bien en la detección de la disponibilidad de los métodos network.These solamente comprobar si el cable de red está conectado o no.La "opción Ping"
if
(La conexión está disponible) devuelvetrue
if
(La conexión no está disponible y el cable de red está enchufado) vuelvefalse
if
(El cable de red no está enchufado)Throws an exception
La interfaz de red
if
(Internet está disponible) DevolucionesTrue
if
(Internet no está disponible y el cable de red está enchufado) DevolucionesTrue
if
(El cable de red no está enchufado) regresafalse
El [DllImport ("Wininet.dll")]
if
(Internet está disponible) DevolucionesTrue
if
(Internet no está disponible y el cable de red está enchufado) DevolucionesTrue
if
(El cable de red no está enchufado) regresafalse
Entonces, en caso de
[DllImport("Wininet.dll")]
yNetworkInterface
no hay forma de saber si hay conexión a Internet disponible.fuente
No resuelve el problema de la caída de la red entre la comprobación y la ejecución de su código, pero es bastante confiable
fuente
Hacer ping a google.com introduce una dependencia de resolución de DNS. Hacer ping 8.8.8.8 está bien, pero Google está a varios saltos de mí. Todo lo que necesito hacer es hacer ping a la cosa más cercana a mí que está en Internet.
Puedo usar la función TTL de Ping para hacer ping al salto n. ° 1, luego al salto n. ° 2, etc., hasta que reciba una respuesta de algo que está en una dirección enrutable; si ese nodo está en una dirección enrutable, entonces está en internet. Para la mayoría de nosotros, el salto n. ° 1 será nuestra puerta de enlace / enrutador local, y el salto n. ° 2 será el primer punto al otro lado de nuestra conexión de fibra o lo que sea.
Este código funciona para mí y responde más rápido que algunas de las otras sugerencias en este hilo porque está haciendo ping a lo que esté más cerca de mí en Internet.
fuente
Así es como se implementa en Android.
Como prueba de concepto, traduje este código a C #:
fuente
fuente
Otra opción es la API de Network List Manager que está disponible para Vista y Windows 7. Artículo de MSDN aquí . En el artículo hay un enlace para descargar ejemplos de código que le permiten hacer esto:
Asegúrese de agregar una referencia a la Biblioteca de tipos de la Lista de redes 1.0 desde la pestaña COM ... que aparecerá como NETWORKLIST.
fuente
Intente evitar probar las conexiones detectando la excepción. porque realmente esperamos que a veces perdamos la conexión de red.
fuente
Si desea notificar al usuario / tomar medidas cada vez que ocurra un cambio en la red / conexión.
Utilice la API de NLM:
https://msdn.microsoft.com/en-us/library/ee264321.aspx
http://www.codeproject.com/Articles/34650/How-to-use-the-Windows-NLM-API-to-get-notified-of
fuente
Personalmente encuentro la respuesta de Anton y moffeltje mejor, pero agregué un cheque para excluir las redes virtuales configuradas por VMWare y otros.
fuente
fuente
bb
aún sería cierto incluso cuando la red no esté conectada a Internet.Versión multiproceso de ping:
fuente
No creo que sea imposible, simplemente no es sencillo.
He construido algo como esto, y sí, no es perfecto, pero el primer paso es esencial: verificar si hay alguna conectividad de red. Windows Api no hace un gran trabajo, entonces ¿por qué no hacer un mejor trabajo?
Es bastante simple, pero realmente ayuda a mejorar la calidad de la verificación, especialmente cuando desea verificar varias configuraciones de proxy.
Entonces:
fuente
fuente
Use NetworkMonitor para monitorear el estado de la red y la conexión a Internet.
Muestra:
fuente
Introducción
En algunos escenarios, debe verificar si Internet está disponible o no utilizando el código C # en las aplicaciones de Windows. Puede ser para descargar o cargar un archivo a través de Internet en formularios de Windows o para obtener algunos datos de la base de datos que se encuentra en una ubicación remota, en estas situaciones, la verificación de Internet es obligatoria.
Hay algunas formas de verificar la disponibilidad de Internet usando C # desde el código detrás. Todas estas formas se explican aquí, incluidas sus limitaciones.
La API 'wininet' se puede usar para verificar si el sistema local tiene conexión a Internet activa o no. El espacio de nombres utilizado para esto es 'System.Runtime.InteropServices' e importa el dll 'wininet.dll' usando DllImport. Después de esto, cree una variable booleana con estática externa con un nombre de función InternetGetConnectedState con la descripción de dos parámetros y reservedValue como se muestra en el ejemplo.
Nota: El modificador externo se usa para declarar un método que se implementa externamente. Un uso común del modificador externo es con el atributo DllImport cuando usa los servicios de Interop para llamar a un código no administrado. En este caso, el método también debe declararse como estático.
El siguiente ejemplo utiliza el método GetIsNetworkAvailable para determinar si hay una conexión de red disponible.
Observaciones (según MSDN): se considera que una conexión de red está disponible si alguna interfaz de red está marcada como "activada" y no es una interfaz de bucle o de túnel.
Hay muchos casos en los que un dispositivo o computadora no está conectado a una red útil, pero todavía se considera disponible y GetIsNetworkAvailable volverá verdadero. Por ejemplo, si el dispositivo que ejecuta la aplicación está conectado a una red inalámbrica que requiere un proxy, pero el proxy no está configurado, GetIsNetworkAvailable devolverá true. Otro ejemplo de cuándo GetIsNetworkAvailable devolverá verdadero es si la aplicación se está ejecutando en una computadora que está conectada a un concentrador o enrutador donde el concentrador o enrutador ha perdido la conexión ascendente.
Las clases Ping y PingReply permiten que una aplicación determine si se puede acceder a una computadora remota a través de la red mediante la respuesta del host. Estas clases están disponibles en el espacio de nombres System.Net.NetworkInformation. El siguiente ejemplo muestra cómo hacer ping a un host.
Observaciones (según MSDN): las aplicaciones utilizan la clase Ping para detectar si se puede acceder a una computadora remota. La topología de la red puede determinar si Ping puede contactar con éxito a un host remoto. La presencia y configuración de servidores proxy, equipos de traducción de direcciones de red (NAT) o firewalls pueden evitar que Ping tenga éxito. Un Ping exitoso indica solo que se puede llegar al host remoto en la red; no se garantiza la presencia de servicios de nivel superior (como un servidor web) en el host remoto.
Comentarios / Sugerencias están invitados. Feliz codificación ......!
fuente
Para mi aplicación también probamos descargando un pequeño archivo.
También. Algunos ISP pueden usar un servidor intermedio para almacenar en caché el archivo. Añadir parámetro aleatorio no utilizado, por ejemplo. https://www.microsoft.com/favicon.ico?req=random_number Puede evitar el almacenamiento en caché.
fuente
Tengo un problema con ese método en mi enrutador / módem 3g, porque si Internet está desconectado, el enrutador redirige la página a su página de respuesta, por lo que aún obtiene un vapor y su código cree que hay internet. Las manzanas (u otras) tienen una página de detección de puntos críticos que siempre devuelve una respuesta determinada. La siguiente muestra devuelve la respuesta "Éxito". ¡Entonces estará exactamente seguro de que puede conectarse a Internet y obtener una respuesta real!
fuente
Tengo tres pruebas para una conexión a Internet.
System.Net
ySystem.Net.Sockets
Prueba 1
Prueba 2
Prueba 3
Realizando las pruebas
Si realiza un
Dictionary
deString
yBoolean
llamóCheckList
, puede agregar los resultados de cada pruebaCheckList
.Ahora, repita a través de cada uno
KeyValuePair
usando unfor...each
bucle.Si
CheckList
contiene unValue
detrue
, entonces sabe que hay una conexión a Internet.fuente
Eso funciona
fuente