- 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
Comprobar el estado del socket
Cuando se trabaja con un socket, se hace necesario comprobar su estado porque las redes distribuidas no son tan fiables como un sistema de archivos. En concreto, la conexión puede perderse por un motivo u otro. La función SocketIsConnected permite averiguarlo.
bool SocketIsConnected(const int socket)
La función comprueba si el socket con el manejador especificado (obtenido de SocketCreate) está conectado a su recurso de red (especificado en Conexión de socket) y devuelve true en caso de éxito.
Otra función, SocketIsReadable, permite saber si hay datos para leer en el búfer del sistema asociado al socket. Esto significa que el ordenador, al que nos conectamos en la dirección de red, nos envió (y puede seguir enviándonos) datos.
uint SocketIsReadable(const int socket)
La función devuelve el número de bytes que se pueden leer del socket. En caso de error, se devuelve 0.
Los programadores familiarizados con las API del sistema de sockets de Windows/Linux saben que un valor 0 también puede ser un estado normal cuando no hay datos entrantes en el búfer interno del socket. Sin embargo, esta función se comporta de manera diferente en MQL5. Con un búfer de socket del sistema vacío, devuelve especulativamente 1, aplazando la comprobación real de la disponibilidad de datos hasta la siguiente llamada a una de las funciones de lectura. En concreto, esta situación con un resultado ficticio de 1 byte se produce, por regla general, la primera vez que se llama a una función en un socket cuando el búfer interno receptor aún está vacío.
Al ejecutar esta función puede producirse un error, lo que significa que la conexión establecida a través de SocketConnect se ha roto (en _LastError obtendremos el código 5273, ERR_NETSOCKET_IO_ERROR).
La función SocketIsReadable es útil en programas diseñados para la lectura «no bloqueante» de datos utilizando SocketRead. La cuestión es que la función SocketRead, cuando no haya datos en el búfer de recepción, esperará su llegada, suspendiendo la ejecución del programa (por el valor de timeout especificado).
Por otro lado, una lectura de bloqueo es más fiable en el sentido de que su programa se «despertará» en cuanto lleguen nuevos datos, pero la comprobación de su presencia con SocketIsReadable debe hacerse periódicamente, en función de algunos otros eventos (normalmente, en un temporizador o en un bucle).
Debe prestarse especial atención al utilizar la función SocketIsReadable en Modo seguro TLS. La función devuelve la cantidad de datos «en bruto», que en el modo TLS es un bloque cifrado. Si los datos «en bruto» aún no se han acumulado en el tamaño del bloque de descifrado, la llamada posterior de la función de lectura SocketTlsRead bloqueará la ejecución del programa, a la espera del fragmento que falta. Si los datos «en bruto» ya contienen un bloque listo para el descifrado, la función de lectura devolverá menos bytes descifrados que el número de bytes «brutos». En este sentido, con TLS activado, se recomienda utilizar siempre la función SocketIsReadable junto con SocketTlsReadAvailable. De lo contrario, el comportamiento del programa diferirá de lo esperado. Por desgracia, MQL5 no proporciona la función SocketTlsIsReadable, que es compatible con el modo TLS y no impone las convenciones descritas.
La función similar SocketIsWritable comprueba si se puede escribir en el socket dado en el momento actual.
bool SocketIsWritable(const int socket)
La función devuelve un indicador de éxito (true) o de error (false). En este último caso, la conexión establecida a través de SocketConnect se romperá.
He aquí un sencillo script SocketIsConnected.mq5 para probar las funciones. En los parámetros de entrada, tendremos la oportunidad de introducir la dirección y el puerto.
input string Server = "www.mql5.com";
|
En el manejador OnStart creamos un socket, nos conectamos al sitio y empezamos a comprobar el estado del socket en un bucle. Después de la segunda iteración, cerramos forzosamente el socket, y esto debería conducir a una salida del bucle.
void OnStart()
|
En el registro se muestran las siguientes entradas:
Server=www.mql5.com / ok
|