SocketTlsRead

Lit des données depuis une connexion TLS sécurisée.

int  SocketTlsRead(
   int           socket,               // socket
   uchar&        buffer[],             // buffer pour lire les données depuis une socket
   uint          buffer_maxlen         // nombre d'octets à lire
   );

Parameters

socket

[in]  Handle de la socket retournée par la fonction SocketCreate. Lorsqu'un handle incorrect est passé à _LastError, l'erreur 5270 (ERR_NETSOCKET_INVALIDHANDLE) est activée.

buffer

[out]  Référence au tableau de type uchar dans lequel les données sont lues. La taille du tableau dynamique est augmentée du nombre d'octets lus. La taille du tableau ne peut pas être supérieure à INT_MAX (2147483647).

buffer_maxlen

[in]  Nombre d'octets à lire dans le tableau buffer[]. Les données ne rentrant pas dans le tableau restent dans la socket. Elles peuvent être lues lors de l'appel suivant à SocketTLSRead. buffer_maxlen ne peut pas être supérieur à INT_MAX (2147483647).

Valeur de Retour

Retourne le nombre d'octets lus en cas de succès. Retourne -1 en cas d'erreur.

Note

Si une erreur se produit sur une socket système lors de l'exécution de la fonction, la connexion établie via SocketConnect est interrompue.

La fonction est exécutée jusqu'à la réception de la quantité spécifiée de données, ou si le timeout est atteint (SocketTimeouts).

En cas d'erreur de lecture des données, l'erreur 5273 (ERR_NETSOCKET_IO_ERROR) est inscrite dans _LastError.

La fonction ne peut être appelée que depuis les Expert Advisors et les scripts, puisqu'ils sont exécutés dans leurs propres threads d'exécution. Si appelé depuis un indicateur, GetLastError() retourne l'erreur 4014 — "Function is not allowed for call".

Exemple :

//+------------------------------------------------------------------+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2000-2024, MetaQuotes Ltd."
#property link        "https://www.mql5.com"
#property version     "1.00"
#property description "Ajoutez une adresse à la liste des adresses autorisées dans les paramètres du terminal pour que l'exemple fonctionne"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Envoie la commande au serveur                                    |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- si la connexion sécurisée TLS est utilisée via le port 443
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- si une connexion TCP standard est utilisée
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lit la réponse du serveur                                        |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- lit les données des sockets tant qu'il y en a, et jusqu'au timeout
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- différentes commande de lecture suivant que la connexion est sécurisée ou pas
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- analyse la réponse
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- n'affiche que l'en-tete de la réponse
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("En-tete de la réponse HTP reçue :");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- vérifie le handle
   if(socket!=INVALID_HANDLE)
     {
      //--- établit la connexion si tout est ok
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Connexion établie avec ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la connexion est sécurisée par un certificat, affiche ses données
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("Certificat TLS :");
            Print("   Propriétaire :  ",subject);
            Print("   Emetteur :  ",issuer);
            Print("   Numéro :     ",serial);
            Print("   Print : ",thumbprint);
            Print("   Expiration : ",expiration);
            ExtTLS=true;
           }
         //--- envoie une requete GET au serveur
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))
           {
            Print("Requête GET envoyée");
            //--- lit la réponse
            if(!HTTPRecv(socket,1000))
               Print("Echec d'obtention d'une réponse, erreur ",GetLastError());
           }
         else
            Print("Echec d'envoi de la requete GET, erreur ",GetLastError());
        }
      else
        {
         Print("Echec de la connexion à ",Address,":",Port,", erreur ",GetLastError());
        }
      //--- ferme la socket après son utilisation
      SocketClose(socket);
     }
   else
      Print("Echec de création d'une socket, erreur ",GetLastError());
  }
//+------------------------------------------------------------------+

Voir également

SocketTimeouts, MathSwap