webrequestmethods net conectar c# ftpwebrequest internet-connection

conectar - ¿Cómo detectar la conexión a internet que funciona en C#?



ftp c# (7)

Tengo un código C # que básicamente carga un archivo a través del protocolo FTP (usando FtpWebRequest ). Sin embargo, me gustaría primero determinar si hay una conexión a Internet que funcione antes de intentar cargar el archivo (ya que, si no hay ningún punto en intentarlo, el software debería quedarse en suspenso durante un tiempo y volver a verificar) .

¿Hay una forma fácil de hacerlo o debería intentar cargar el archivo y en caso de que fallara, inténtelo nuevamente, asumiendo que la conexión de red no funcionó?


¿No puedes usar la Ping de Ping del espacio de nombres de información de la red de sistemas.Net para hacer ping al servidor de FTP antes de intentar cargar el archivo?


Acabo de escribir funciones asíncronas para hacer eso:

private void myPingCompletedCallback(object sender, PingCompletedEventArgs e) { if (e.Cancelled) return; if (e.Error != null) return; if (e.Reply.Status == IPStatus.Success) { //ok connected to internet, do something... } } private void checkInternet() { Ping myPing = new Ping(); myPing.PingCompleted += new PingCompletedEventHandler(myPingCompletedCallback); try { myPing.SendAsync("google.com", 3000 /*3 secs timeout*/, new byte[32], new PingOptions(64, true)); } catch { } }


Creo que la mejor aproximación que puede usar es verificar el valor del estado OperationalStatus en el tipo NetworkInterface .

using System.Net.NetworkInformation; public bool IsNetworkLikelyAvailable() { return NetworkInterface .GetAllNetworkInterfaces() .Any(x => x.OperationalStatus == OperationalStatus.Up); }

Recuerde que esto es una aproximación. En el momento en que este método devuelve, la computadora podría perder o ganar su conexión a Internet. En mi opinión, me gustaría ir directamente a la carga y manejar el error, ya que no puede probar que no ocurrirá.


Hay un evento de "disponibilidad de red cambiada" que se activa cuando el estado "activo" de una conexión de red cambia en una interfaz que no es un túnel o bucle invertido.

Puede leer el estado de todos los adaptadores de red en el sistema al inicio, almacenar el valor actual de "la red está disponible", escuchar este evento y cambiar su variable de estado de red cuando este evento se dispare. Esto también parece que manejará conexiones de acceso telefónico y RDSI también.

Por supuesto, hay otros factores que se deben tener en cuenta, como que la NIC está conectada a un enrutador (y funciona), pero la conexión a Internet en el enrutador está inactiva o el host remoto no responde, pero esto al menos evitará que intentes realice una conexión que no va a funcionar si no hay una conexión de red con la que comenzar (por ejemplo, el enlace VPN o RDSI está inactivo).

Esta es una aplicación de consola de C #. Comience a correr, deshabilite o desenchufe su conexión de red :-)

class Program { static bool networkIsAvailable = false; static void Main(string[] args) { NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterface nic in nics) { if ( (nic.NetworkInterfaceType != NetworkInterfaceType.Loopback && nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && nic.OperationalStatus == OperationalStatus.Up) { networkIsAvailable = true; } } Console.Write("Network availability: "); Console.WriteLine(networkIsAvailable); NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(NetworkChange_NetworkAvailabilityChanged); Console.ReadLine(); } static void NetworkChange_NetworkAvailabilityChanged(object sender, NetworkAvailabilityEventArgs e) { networkIsAvailable = e.IsAvailable; Console.Write("Network availability: "); Console.WriteLine(networkIsAvailable); } }


Piense en la situación en la que su cheque regresa y dice "la conexión está ahí", y antes de que pueda iniciar su FTP, la conexión se cae.

O donde la conexión cae parcialmente a través de su solicitud de FTP.

Dado que tienes que codificar para estas situaciones de todos modos , simplemente omite la verificación

Editar en respuesta a los comentarios de Jason.

También puede ocurrir que ocurra la condición opuesta: cuando se comprueba una conexión, no existe ninguna, pero un momento después, su conexión se activa. Entonces, ¿qué haces? ¿Empiezas a molestar al usuario por la ausencia de conexión, aunque ahora está disponible?

Al final del día, está tratando con una gran cantidad de recursos (su conexión de red, cualquier enrutador intermedio, el host, su servicio FTP). Todo esto está sujeto a cambios fuera de su control (como indica el comentario de Seth), y ninguna prueba previa responderá a la pregunta "¿podré completar esta carga"?

Como el OP indicó que está pensando en un enfoque de "retroceder y volver a intentarlo más tarde", creo que es apropiado hacer todo eso en segundo plano y no molestar al usuario en absoluto, a menos que haya estado intentando un "irrazonable". "cantidad de tiempo sin éxito.


Si el ping es difícil para ti, solo usa webclient.

public static bool CheckForInternetConnection() { try { using (var client = new WebClient()) using (var stream = client.OpenRead("http://www.google.com")) { return true; } } catch { return false; } }

o cualquier otro sitio. EDITAR: puede utilizar http://www.msftncsi.com/ este sitio. Este es un sitio que se ejecuta solo para conectividad a internet. Vea una explicación detallada del registro de cómo Windows 7 encuentra la conectividad de Internet http://blog.superuser.com/2011/05/16/windows-7-network-awareness/


Solo usa la función simple

System.Net.NetworkInformation.NetworkInterface.GetIsNetworkAvailable()

que devuelven verdadero o falso si la conexión está para arriba.

Desde MSDN: una conexión de red se considera disponible si alguna interfaz de red está marcada como "arriba" y no es una interfaz de bucle invertido o túnel.

Tenga en cuenta que la conectividad no es todo, puede estar conectado a una red local y el enrutador no está conectado a Internet, por ejemplo. Para saber realmente si está conectado a Internet, pruebe la clase Ping .