En mi post anterior sobre este tema hablé de un primer método de detección basado en la APi de Windows. Hoy me toca hablar de otro similar, si bien usando una API completamente diferente. Los restantes métodos que veremos no necesitan ya el uso de la API.

En esta ocasión usaremos la API del servicio de notificación de eventos del sistema, o sea, la System Event Notification Service (SENS) API. En concreto haremos uso de la función IsNetworkAlive, que se define así:

[DllImport("sensapi.dll")]
private static extern bool IsNetworkAlive(ref uint flags);

Este método devuelve verdadero o falso en función de si hay o no conexión a la red. ¡Ojo!, a la red, no necesariamente a Internet, pero en muchas ocasiones lo que querremos es eso (si trabajamos sólo en una red local).

Así, podemos definir nuestra propiedad IsConnected con esta función así:

public static bool IsConnected2
{
    get
    {
        uint flags = 0;
        return IsNetworkAlive(ref flags);
    }
}

Lo interesante de esta función es que el parámetro que toma es un indicador por referencia que devuelve un valor que nos permite averiguar si la conexión actual es a través de una tarjeta de red o mediante un acceso telefónico remoto, para lo cual se definen estas dos constantes:

private const int NETWORK_ALIVE_LAN = 0x00000001; 
private const int NETWORK_ALIVE_WAN = 0x00000002; 

Se puede comparar (comparación binaria) el valor devuelto en este parámetro con estos valores y saber si estamos conectados a una red local, a través de RAS o ambas cosas.

Según indican en la documentación de MSDN esta función es más lenta que la anterior, pero tiene la ventaja de que permite distinguir estos dos casos y además detecta las conexiones RAS de inmediato.

En breve más :-)

💪🏻 ¿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