En un anterior post, demostré con un sencillo ejemplo el uso del nuevo espacio de nombres de .NET 2.0 llamado NetworkInformation creando un ejemplo de utilidad para hacer Ping síncrono a otras máquinas de manera sencilla.

He seguido jugueteando con él un rato y en esta ocasión voy a mostrar cómo usarlo para verificar si existe o no conectividad en alguna de las tarjetas de red disponibles en el equipo. Se trata de una tarea extremadamente sencilla ya que basta con escribir:

bool disponible = NetworkInterface.GetIsNetworkAvailable();

¡Listo! Con que cualquier adaptador de red disponga de conectividad devolverá true.

Lo interesante sin embargo es poder detectar de inmediato los cambios de conectividad cuando se produzcan, de modo que en una comunicación podamos responder a la caida de la red  así como a su restablecimiento.

Una primera forma de hacerlo "a lo bestia" sería usar un temporizador para que compruebe la información anterior cada segundo o así. Esto, aparte de ser ineficiente, no es necesario.

Existe una nueva clase especializada llamada NetworkChange que se usa para estos menesteres. Dispone de dos eventos llamados NetworkAvailabilityChanged y NetworkAddressChanged que permiten averiguar respectivamente si ha cambiado la conectividad y la dirección IP de alguna tarjeta.

Usarlos es muy fácil, basta con declarar los eventos, asi:

        public static void Main()
        {
            InitializeComponent();

            NetworkChange.NetworkAvailabilityChanged += new NetworkAvailabilityChangedEventHandler(OnConexion_Desconexion);
            NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);
           Console.ReadLine();
        }

        private void OnConexion_Desconexion(object sender, NetworkAvailabilityEventArgs disponibilidad)
        {
            MessageBox.Show(String.Format("¿Red disponible?: {0}", disponibilidad.IsAvailable));
        }

        void NetworkChange_NetworkAddressChanged(object sender, EventArgs e)
        {
            MessageBox.Show("Ha cambiado la dirección IP de alguna tarjeta");
        }

Como se puede observar la información ofrecida en los eventos no es mucha, pero al menos nos permite averiguar cuando se da alguno de estos cambios. Es una pena que, por ejemplo, en el objeto sender no obtengamos una referencia a una clase NetworkInterface que nos permitiese saber exactamente en cuál se han producido los cambios. Sólo sabemos que se producen pero no donde o cual es la nueva IP, por ejemplo. Una lástima ya que ello nos obliga a averiguarlo recorriendo la colección de interfaces de red y compararla con una pre-guardada.

La verdad es que no hubiera costado mucho y hubieran cerrado el espacio de nombres mucho más dignamente. De todos modos esto es muy útil.

💪🏻 ¿Este post te ha ayudado?, ¿has aprendido algo nuevo?
Pues NO te pido que me invites a un café... Te pido algo más fácil y mucho mejor

Escrito por un humano, no por una IA