Este paso debe ser el siguiente a la llamada a InternetOpen, es decir, el primer paso después de realizar las operaciones previas, y es en este momento cuando tenemos que decidir, tanto el servidor al que nos vamos a conectar, como el número de puerto y el protocolo a utilizar.
Esta operación se hace a través de la función InternetConnect, que se utiliza tanto en protolos con conexión (FTP) como sin ella (HTTP y Gopher). En el primer caso, debemos establecer la conexión en el momento en que el usuario lo decida (indicando usuario y clave), sin embargo, en el segundo caso (para el protocolo HTTP), debemos minimizar el uso de esta función, y evitar establecer una conexión por cada petición que hagamos contra el mismo servidor. Una buen método de hacer esto es a través de un pool de conexiones, almacenando un descriptor por cada servidor distinto al que nos conectamos y reutilizando ese descriptor en las distintas peticiones.
La sintaxis de la función InternetOpen es la siguiente:
HINTERNET InternetConnect(
HINTERNET hInet,
LPCTSTR lpszServidor,
INTERNET_PORT nPuerto,
LPCTSTR lpszUsuario,
LPCTSTR lpszClave,
DWORD dwProtocolo,
DWORD dwOpciones,
DWORD_PTR dwContexto
);
Vamos a ver qué significan estos parámetros:
- hInet: el descriptor que hemos obtenido a través de la llamada anterior a InternetOpen.
- lpszServidor: una cadena con el nombre o dirección IP del servidor a conectar. Hay que recordar que en este parámetro sólo hay que indicar el nombre de host (p.e. www.lawebdejm.com) y no el protocolo y el host (http://www.lawebdejm.com)
- nPuerto: podemos utilizar un valor numérico cualquiera, o bien una de las siguientes constantes predefinidas:
- INTERNET_DEFAULT_FTP_PORT: puerto por defecto para servidores FTP (21)
- INTERNET_DEFAULT_GOPHER_PORT: puerto por defecto para servidores Gopher (70)
- INTERNET_DEFAULT_HTTP_PORT: puerto por defecto para servidores HTTP (80)
- INTERNET_DEFAULT_HTTPS_PORT: puerto por defecto para servidores HTTPS (443)
- INTERNET_DEFAULT_SOCKS_PORT: puerto por defecto para corta-fuegos (1080)
- INTERNET_INVALID_PORT_NUMBER: utiliza el puerto por defecto según el protocolo pasado en el parámetro dwProtocolo.
- lpszUsuario: un puntero a cadena con el nombre de usuario a utilizar. Para el protocolo HTTP, debemos utilizar una cadena vacía para conectarnos de forma anónima.
- lpszClave: la clave del nombre de usuario. Para el protocolo HTTP, debemos utilizar una cadena vacía para conectarnos de forma anónima.
- dwProtocolo: indica el tipo de protocolo que vamos a utilizar en la conexión. Este parámetro puede contener uno de los siguiente valores:
- INTERNET_SERVICE_HTTP: conectarnos a un servidor HTTP
- INTERNET_SERVICE_FTP: conectarnos a un servidor FTP
- INTERNET_SERVICE_GOPHER: conectarnos a un servidor Gopher.
- dwOpciones: opciones para la conexión. Si utilizamos el protocolo HTTP, no tenemos ninguna opción disponible.
- dwConexto: tiene el mismo significado que para la función InternetOpenUrl, es decir, se utilizará para pasarlo a la función de "callback" en las conexiones asíncronas (pasando INTERNET_FLAG_ASYNC en el parámetro dwOpciones de la función InternetOpen). Para conexiones síncronas (por defecto), este parámetro se ignorará, por lo que el valor pasado no tendrá ningún significado.
Esta función retorna un descriptor de conexión en caso de que todo haya ido bien, o el valor NULL si ha ocurrido un fallo.
En caso de error, se puede utilizar la función GetLastError para retornar el código de error. Recordemos que si GetLastError retorna ERROR_INTERNET_EXTENDED_ERROR, debemos llamar a la función InternetGetLastResponseInfo para que nos retorne el código y la descripción del último mensaje de error recibido desde el servidor.