Últimamente he estado trabajando bastante con la nueva API de Sincronización de Microsoft (Microsoft Sync Framework) que ahora mismo se encuentra en CTP (Community Technology Review), es decir, todavía no es la versión definitiva (pero casi). Esta plataforma te permite crear aplicaciones capaces de trabajar conectadas o desconectadas, y además sincronizar bases de datos, carpetas locales y remotas o información RSS se convierte en un trabajo sencillo. La API es bastante extensa y no voy a hablar de ella aquí (pronto leereis un artículo mío sobre el tema en DotNetMania). En lo que me quiero centrar es en el hecho de que, para trabajar desconectado, primero hay que saber qué realmente lo estamos ¿no?

De hecho en la API no hay referencia alguna a esto, y muchos de los que la usen se preguntarán "vale, ya sé trabajar en local cuando no hayconexión y sé cómo sincronizarla con una remota (o con la de cualquier otro equipo en redes P2P también soportadas por la API) cuando recupere la conexión, pero ¿Cómo diantres sé si tengo o no conexión?"

Bueno, hay varias formas de conseguirlo. Al menos se me ocurren cinco por lo menos. Así que lo que voy a hacer es comentar hoy el primero de los métodos y en los próximos post contaré los restantes. Chico, tengo poco tiempo, qué quieres :-(

En el últipo post, además, colgaré un ejemplo completo para descarga ¿OK?

El primero usa la API de Internet de Windows (WinInet) y en concreto la función InternetGetConnectedState. Asegúrate de incluir el spacio de nombres de ineroperatividad:

using System.Runtime.InteropServices;

La definición de esta función de la API de Windows es:

[DllImport("wininet.dll")]
private static extern bool InternetGetConnectedState(ref uint flags, uint dwReserved);

Así que podemos definir una propiedad de nuestra clase de utilidades para comprobar la conectividad así:

    public static bool IsConnected
    {
        get
        {
                uint flags = 0;
                return InternetGetConnectedState(ref flags,0);
        }
    } 

Con ello sabremos si alguna de las tarjetas de red de nuestro equipo están conectadas a Internet o no.

Además esta función nos permite saber a través de unas constantes que se pueden comparar con el resultado devuelto en "flags", cómo estamos conectados a Internet:

    private const int INTERNET_CONNECTION_CONFIGURED = 0x40; //Conexión a Internet configurada, pero no tiene porqué estar activa
    private const int INTERNET_CONNECTION_LAN = 0x02; //Se usa la red local para salir a Internet
    private const int INTERNET_CONNECTION_MODEM = 0x01; //se usa un módem
    private const int INTERNET_CONNECTION_PROXY = 0x04; //Se sale a través de un proxy

Así que incluso podemos obtener información extra interesante.

En cuanto pueda meto el resto de métodos que se me ocurren y preparo un ejemplo de código :-)

Escrito por un humano, no por una IA