- Envío de notificaciones push
- Envío de notificaciones por correo electrónico
- Envío de archivos a un servidor FTP
- Intercambio de datos con un servidor web a través de HTTP/HTTPS
- Establecer y romper una conexión de socket de red
- Comprobar el estado del socket
- Establecer tiempos de espera de envío y recepción de datos para sockets
- Leer y escribir datos a través de una conexión de socket insegura
- Preparar una conexión de socket segura
- Leer y escribir datos a través de una conexión de socket segura
Preparar una conexión de socket segura
Para transferir una conexión de socket a un estado protegido y comprobarlo, MQL6 proporciona las siguientes funciones: SocketTlsHandshake y SocketTlsCertificate, respectivamente. Por regla general, no necesitamos activar «manualmente» la protección llamando a SocketTlsHandshake si la conexión se establece en el puerto 443. El hecho es que es estándar para HTTPS (TLS).
La protección se basa en el cifrado del flujo de datos entre el cliente y el servidor, para lo cual se utiliza inicialmente un par de claves asimétricas: pública y privada. Ya hemos tratado este tema en la sección Visión general de los métodos de transformación de la información disponibles. Cada sitio decente adquiere un certificado digital de una de las autoridades de certificación (CA) en las que confía la comunidad de la red. El certificado contiene la clave pública del sitio y está firmado digitalmente por el centro. Los navegadores y otras aplicaciones cliente almacenan (o pueden importar) las claves públicas de las CA y, por tanto, pueden verificar la calidad de un certificado concreto.

Establecer una conexión TLS segura
(imagen de internet)
Además, al preparar una conexión segura, el navegador o la aplicación genera un cierto «secreto», lo cifra con la clave pública del sitio y le envía la clave, y el sitio lo descifra con la clave privada que sólo él conoce. Esta etapa parece más complicada en la práctica, pero como resultado, tanto el cliente como el servidor disponen de la clave de cifrado para la sesión (conexión) actual. Esta clave la utilizan los dos participantes en la comunicación para cifrar las solicitudes y respuestas posteriores en un extremo y descifrarlas en el otro.
La función SocketTlsHandshake inicia una conexión TLS segura con el host especificado utilizando el protocolo handshake de TLS. En este caso, el cliente y el servidor acuerdan los parámetros de conexión: la versión del protocolo utilizado y el método de cifrado de los datos.
bool SocketTlsHandshake(int socket, const string host)
En los parámetros de la función se pasan el manejador de socket y la dirección del servidor con el que se establece la conexión (de hecho, es el mismo nombre que se especificó en SocketConnect).
Antes de establecer una conexión segura, el programa debe establecer primero una conexión TCP normal con el host utilizando SocketConnect.
La función devuelve true si tiene éxito; en caso contrario, devuelve false. En caso de error, se escribe el código 5274 (ERR_NETSOCKET_HANDSHAKE_FAILED) en _LastError.
La función SocketTlsCertificate obtiene información sobre el certificado utilizado para proteger la conexión de red.
int SocketTlsCertificate(int socket, string &subject, string &issuer, string &serial, string &thumbprint, datetime &expiration)
Si se establece una conexión segura para el socket (ya sea tras una llamada explícita y satisfactoria a SocketTlsHandshake o tras conectarse a través del puerto 443), esta función rellena todas las demás variables de referencia del descriptor del socket con la información correspondiente: el nombre del propietario del certificado (subject), el nombre del emisor del certificado (issuer), el número de serie (serial), la huella digital (thumbprint) y el periodo de validez del certificado (expiration).
La función devuelve true en caso de recepción satisfactoria de la información sobre el certificado, o false como resultado de un error. El código de error es 5275 (ERR_NETSOCKET_NO_CERTIFICATE). Permite determinar si la conexión abierta por SocketConnect se encuentra en modo protegido de forma inmediata. Lo utilizaremos en un ejemplo en la siguiente sección.