SocketTlsSend

Invia dati tramite connessione TLS protetta.

int  SocketTlsSend(
   int           socket,               // socket
   const uchar&  buffer[],             // buffer dati
   uint          buffer_len            // grandezza buffer
   );

Parametri

socket

[in] Handle del socket restituito dalla funzione SocketCreate. Quando viene passato un handle errato, viene scritto l'errore 5270 (ERR_NETSOCKET_INVALIDHANDLE) _LastError.

buffer

[in] Riferimento all'array di tipo uchar con i dati da inviare.

buffer_len

[in] grandezza dell'array 'buffer'.

Valore di Ritorno

In caso di successo, restituisce il numero di byte scritti su un socket. In caso di errore, viene restituito -1.

Nota

Se si verifica un errore su un socket di sistema durante l'esecuzione della funzione, la connessione stabilita tramite SocketConnect viene interrotta.

In caso di errore di scrittura dei dati, viene scritto l'errore 5273 (ERR_NETSOCKET_IO_ERROR) in _LastError.

La funzione può essere chiamata solo da Expert Advisors e scripts, poiché vengono eseguiti nei relativi thread di esecuzione. Se si chiama da un indicatore, GetLastError() restituisce l'errore 4014 - "Function is not allowed for call (la funzione non è consentita per la chiamata)".

Esempio:

//+------------------------------------------------------------------+
//|                                                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();
//--- controllare l'handle
   if(socket!=INVALID_HANDLE)
     {
 //--- se tutto va bene, connettere
      if(SocketConnect(socket,Address,Port,1000))
        {
         PrintFormat("Established connection to %s:%d",Address,Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
 //--- se la connessione è protetta da un certificato, visualizzare i dati di tale certificato
         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);
           }
 //--- inviare la richiesta GET al server
         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;
           }
 //--- se si utilizza una connessione TLS sicura tramite la porta 443
         if(SocketTlsSend(socket,req,len)==len)
           {
            Print("GET request sent");
 //--- leggere la risposta
            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());
        }
 //--- chiudere il socket dopo l'uso
      SocketClose(socket);
     }
   else
      Print("Failed to create a socket, error ",GetLastError());
  }
//+------------------------------------------------------------------+
//| Leggere la risposta del server                                   |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout_ms)
  {
//--- leggere i dati dal socket mentre c'è, ma non più del timeout
   char   rsp[];
   string result;
   ulong  timeout_check=GetTickCount64()+timeout_ms;
 
   do
     {
      uint len=SocketIsReadable(socket);
 
      if(len)
        {
 //--- leggere e analizzare i dati di una connessione TLS sicura
         int rsp_len=SocketTlsRead(socket,rsp,len);
 
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
 //--- visualizzare solo l'header della risposta
            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);
              }
 //--- aggiornamento del tempo di scadenza di lettura
            timeout_check=GetTickCount64()+timeout_ms;
           }
        }
     }
   while(GetTickCount64()<timeout_check && !IsStopped());
 
   return(false);
  }

Guarda anche

SocketTimeouts, MathSwap, StringToCharArray