Los rincones del API Win32: Introducción al API WinInet - Funciones de estado de la conexión

8 - Funciones de estado de la conexión

[editar]
Tutorial creado por Juan Manuel. Extraido de: http://www.lawebdejm.com
30 de Noviembre de 1999
Uno de los principales problemas a la hora de conectarnos a internet, suele ser los distintos tipos de configuración y la comprobación de la conexión. Hasta ahora, podíamos apoyarnos en el API RAS (Remote Access Service) para consultar la configuración del módem, aunque a partir de Wininet, se nos ofrece una serie de funciones para estas tareas.

Antes de empezar, hay que dejar claro que sólo hay una manera de comprobar al 100% la existencia una conexión: intentando acceder a un recurso remoto (por ejemplo con un ping), pero esto suele ser una tarea lenta, en la que tenemos que dejar que se agote un tiempo de espera (timeout), para asegurarnos de que no hay nadie al otro lado escuchando nuestras peticiones. Para evitar este tiempo de espera, existen otras funciones que intentan averiguar el estado de conexión o la posibilidad de acceso a internet, sin intentar realizar una petición a la red. Concretamente se considera que un equipo no tiene conexión a internet cuando no tiene ni tarjeta de red ni módem configurado. Estas son las posibilidades, según la gente de Microsoft:

    1. IsNetworkAlive / IsDestinationReachable: estas funciones sólo están disponibles si tenemos instalada cualquier versión de Internet Explorer a partir de la 5. Nos permiten comprobar una tipo de conexión o incluso hacer un ping a una URL determinada para garantizar la conexión. El principal inconveniente es que estas funciones no permiten la existencia de firewalls en la conexión, por lo que muchas redes de empresa no permitirían su uso.

    2. RasEnumConnections: para conexión vía módem, podemos utilizar esta función del API RAS que nos permite consultar la configuración de los módems que tengamos instalados en nuestro sistema.

    3. InternetAttemptConnect: esta función nos permite hacer un primer intento de conexión a internet. Si el usuario configuró su sistema como con "auto-marcado" (Panel de control - Opciones de internet - Conexiones - Marcar siempre la conexión predeterminada), esta función mostrará la ventana de marcado del módem. Si este intento falla, se activará la bandera global de conexión "Trabajar sin conexión".

    4. InternetCheckConnection: según la documentación oficial, esta función intenta acceder a una URL dada haciendo un ping. La práctica (y sus propios autores) nos dice que no funciona, y que debe evitarse su uso (un buen trabajo de Microsoft).

    5. InetIsOffline: esta función está exportada en la librería URL.DLL y según la documentación, nos indica que estamos conectados si la conexión está activa o si todavía no ha habido ningún intento de conexión. Por si fuera poco, la función nos informa de que estamos conectados símplemente si hay una tarjeta de red configurada en el sistema, aunque el cable esté desconectado. Por todo esto, se desaconseja el uso de esta función.

    6. InternetGetConnectedState: a partir de IE 4 se nos ofrece esta función que nos permite distinguir configuraciones típicas como conexión por módem o conexión vía LAN, aunque no gestiona bien configuraciones complejas como LAN + router con auto-marcado. Además, esta función es capaz de retornarnos el valor de la bandera "Trabajar sin conexión".

    7. La bandera "Trabajar sin conexión": también a partir de IE 4, se gestiona una variable global (almacenada en el registro) que nos indica si debemos trabajar con o sin conexión a internet. Esta bandera suele actuar de un modo complementario con el resto de funciones y su valor puede consultarse o modificarse a través de la función InternetQueryOption. Para asegurarnos que pasamos a un estado "Trabajar con conexión", debemos llamar a la función InternetGoOnline. Esta bandera, junto con el uso de la función InternetGetConnectedState, parece ser el método más fiable de comprobar la conexión (si intentar un acceso a la red), de hecho, es el método que utiliza Microsoft para sus aplicaciones (IE, Outlook, etc.).

Ahora vamos a describir con más profundidad la sintaxis de algunas de estas funciones:


IsNetworkAlive

Esta función sólo la tendremos disponible a partir de IE 5, por lo que debemos asegurarnos de su existencia antes de usarla. Para ellos, lo mejor que podemos hacer es una carga dinámica de la librería Wininet.dll y de esta función. Para aprender más sobre la carga de librerías, podéis consultar el artículo de C++Builder sobre "Librerías de enlace dinámico", aparecido en el número 4 de la revista Síntesis.

BOOL IsNetworkAlive(
LPDWORD dwTipoConexión
);

Esta función retornará TRUE o FALSE dependiendo si considera al sistema preparado para establecer una conexión a internet, según el método indicado en el parámetro. Hay que recordar que esta función no detectará una conexión correcta detrás de firewalls corporativos. Los valores permitidos para dwTipoconexión son:

  • NETWORK_ALIVE_LAN: el sistema cuenta con tarjeta de red y conexión a red local.

  • NETWORK_ALIVE_WAN: el sistema cuenta con una conexión remota activa.


IsDestinationReachable

También sólo disponible desde IE5, nos permite comprobar la conexión física a un host así como consultar la calidad de la conexión establecida.

BOOL IsDestinationReachable(
          LPCSTR lpszDestino,
          LPQOCINFO lpCalidad
      );

Los parámetros son los siguientes:

  • lpszDestino: una URL a la que se hará un ping.

  • lpCalidad: un puntero a una estructura de tipo QOCINFO (Quality Of Connection INFO) con el siguiente aspecto:
    typedef struct tagQOCINFO {
         DWORD   dwSize;
         DWORD   dwFlags;
         DWORD   dwInSpeed;
         DWORD   dwOutSpeed;
     } QOCINFO, *LPQOCINFO;
    El significado de cada uno de los campos es:

    • dwSize: como siempre, el tamaño de la estructura: sizeof(QOCINFO).

    • dwFlags: nos da información sobre el tipo de conexión disponible. Los valores permitidos son los mismos que para el parámetro dwTipoConexión de la función IsNetworkAlive.

    • dwInSpeed: velocidad de recepción de datos, en bytes por segundo.

    • dwOutSpeed: velocidad de envío de datos, en bytes por segundo.

La función nos retornará TRUE si el equipo tiene una conexión a internet abierta.


InternetAttemptConnect

Esta función se usa para hacer el primer intento de conexión, y permitir al sistema que marque el módem si así está configurado. La función es muy sencilla:

DWORD InternetAttemptConnect(
           DWORD dwReserved
       );

Como parámetro debemos pasar siempre un 0, y la función nos retornará el valor ERROR_SUCCESS si todo ha ido bien, o un código de error en caso contrario.

Hay que tener en cuenta que esta función nos abrirá la ventana de marcado del módem, si hemos configurado la opción de configuración del acceso telefónico a redes (en "Panel de control - Opciones de internet - Conexiones"), como "Marcar siempre la conexión predeterminada". Si en dicha ventana se pulsa el botón cancelar o "Trabajar sin conexión", se activará esta bandera global.


InternetGetConnectedState

Esta función nos consultará el estado de conexión de nuestro sistema.

BOOL InternetGetConnectedState(
          LPDWORD  lpdwTipoConexion,
          DWORD    dwReservado
      );

El segundo argumento es un valor de 32 bits que debe valer siempre 0, y el primer es un puntero a otro valor de 32 bits que contendrá el tipo de conexión. Los distintos valores combinados que se retornarán, son:

  • INTERNET_CONNECTION_CONFIGURED: indica que hay algún enlace a internet configurado, pero no es seguro que esté activo en este momento.

  • INTERNET_CONNECTION_LAN: se utiliza una red local para acceder a internet.

  • INTERNET_CONNECTION_MODEM: se utiliza un módem para acceder a internet.

  • INTERNET_CONNECTION_OFFLINE: la bandera de "Trabajar sin conexión" está activada, valor que puede haber adquirido desde cualquier otra aplicación que acceda a ella.

  • INTERNET_CONNECTION_PROXY: se utiliza un proxy para acceder a internet.

  • INTERNET_RAS_INSTALLED: El sistema tiene algún sistema de acceso remoto configurado.

La función retornará TRUE o FALSE, dependiendo del éxito en su ejecución.


InternetGoOnline

Esta función nos activa la bandera "Trabajar sin conexión", pidiendo permiso al usuario a través de una ventana de diálogo estándar. La ventana en cuestión podéis verla en la siguiente figura:

BOOL InternetGoOnline(
           LPTSTR lpszURL,
           HWND   hwndPadre,
           DWORD  dwReservado
       );

Los parámetros tienen los siguientes significados:

  • lpszURL: la URL a la que se quiere conectar.

  • hwndPadre: la ventana padre del cuadro diálogo que puede mostrarse. El cuadro de diálogo de la imágen anterior es una ventana modal, por lo que debe indicarse el descriptor de la ventana padre. Un posible valor correcto puede ser el retornado por alguna de las funciones GetActiveWindow, GetDesktopWindow o GetForegroundWindow.

  • dwReservado: debe ser 0.

Como siempre, se retornará TRUE o FALSE dependiendo de si el usuario ha pulsado en el botón "Conectar" o "Seguir desconectado" de la ventana.

[editar]

Sé el primero en opinar


Tutoriales relacionados con 'Los rincones del API Win32: Introducción al API WinInet'

Comienzo con un nuevo tema dentro dentro de la serie Los rincones del API Win32.... Más »
El protocolo FTP desde el API WinInet. Con este curso aprenderás a hacer un pequeño... Más »
Entramos en temas interesantes: el acceso a recursos remotos a través del protocolo de aplicación... Más »
En el anterior curso dejamos muchos temas en el tintero, así que voy a terminar... Más »
Damos una visión detallada de una de las características más interesantes de esta tecnología de... Más »

Autor y licencia de 'Los rincones del API Win32: Introducción al API WinInet'


Tutorial de Juan Manuel. Extraido de: http://www.lawebdejm.com CopyLeft
Este contenido ha sido recopilado por el equipo de Wikilearning. Todo el contenido recopilado se ha obtenido respetando y comunicando en nuestro site la licencia de cada fuente.
Wikilearning tiene permiso expreso por escrito de los autores para publicar los contenidos que ha extraído de otras webs, incluyendo su uso comercial.