SocketTlsSend

Envoi des données via une connexion TLS sécurisée.

int  SocketTlsSend(
   int           socket,               // socket
   const uchar&  buffer[],             // buffer de données
   uint          buffer_len            // taille du buffer
   );

Paramètres

socket

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

buffer

[in]  Référence à un tableau de type uchar contenant les données à envoyer.

buffer_len

[in]  Taille du tableau 'buffer'.

Valeur de Retour

En cas de succès, retourne le nombre d'octets écrits sur une socket. 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.

En cas d'erreur d'écriture 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 elle est appelée depuis un indicateur, GetLastError() retourne l'erreur 4014 — "Function is not allowed for call".

Exemple :

//+------------------------------------------------------------------+
//|                                                SocketTlsSend.mq5 |
//|                                  Copyright 2024, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2024, MetaQuotes Ltd."
#property link      "https://www.mql5.com
#property version     "1.00"
#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =443;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   int socket=SocketCreate();
//--- vérifie le handle
   if(socket!=INVALID_HANDLE)
     {
      //--- on se connecte si tout est bon
      if(SocketConnect(socket,Address,Port,1000))
        {
         PrintFormat("Established connection to %s:%d",Address,Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la connexion est protégée par un certificat, affiche ses données
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("TLS certificate:");
            Print("   Owner:      ",subject);
            Print("   Issuer:     ",issuer);
            Print("   Number:     ",serial);
            Print("   Print:      ",thumbprint);
            Print("   Expiration: ",expiration);
           }
         //--- envoie une requête GET au serveur
         string request="GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n";
         char   req[];
         int    len=StringToCharArray(request,req)-1;
 
         if(len<0)
           {
            Print("StringToCharArray() failed. Error "GetLastError());
            SocketClose(socket);
            return;
           }
         //--- si une connexion TLS sécurisée via le port 443 est utilisée
         if(SocketTlsSend(socket,req,len)==len)
           {
            Print("GET request sent");
            //--- lit la réponse
            if(!HTTPRecv(socket,1000))
               Print("Failed to get a response, error ",GetLastError());
           }
         else
            Print("Failed to send GET request, error ",GetLastError());
        }
      else
        {
         PrintFormat("Connection to %s:%d failed, error %d",Address,Port,GetLastError());
        }
      //--- ferme la socket après son utilisation
      SocketClose(socket);
     }
   else
      Print("Failed to create a socket, error ",GetLastError());
  }
//+------------------------------------------------------------------+
//| Read server response                                             |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout_ms)
  {
//--- lit les données depuis la socket tant qu'il y en a, mais pas plus longtemps que le délai d'attente
   char   rsp[];
   string result;
   ulong  timeout_check=GetTickCount64()+timeout_ms;
 
   do
     {
      uint len=SocketIsReadable(socket);
 
      if(len)
        {
         //--- lit et analyse les données d'une connexion TLS sécurisée
         int rsp_len=SocketTlsRead(socket,rsp,len);
 
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- affiche uniquement l'en-tête de la réponse
            int header_end=StringFind(result,"\r\n\r\n");
 
            if(header_end>0)
              {
               Print("HTTP answer header received:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
            //--- met à jour le délai d'expiration du délai de lecture
            timeout_check=GetTickCount64()+timeout_ms;
           }
        }
     }
   while(GetTickCount64()<timeout_check && !IsStopped());
 
   return(false);
  }

Voir également

SocketTimeouts, MathSwap, StringToCharArray