SocketTlsSend

Senden von Daten über eine sichere TLS-Verbindung

int  SocketTlsSend(
   int           socket,               // Socket
   const uchar&  buffer[],             // Datenpuffer
   uint          buffer_len            // Puffergröße
   );

Parameter

socket

[in]  Das Handle des Sockets, das von der Funktion SocketCreate erzeugt worden war. Wurde ein ungültiges Handle erstellt, wird der Fehler 5270 (ERR_NETSOCKET_INVALIDHANDLE) der Variablen _LastError zugewiesen.

buffer

[in]  Referenz des Arrays vom Typ uchar mit den Daten, die gesendet werden sollen.

buffer_len

[in]  'buffer' Arraygröße.

Rückgabewert

Bei einem Erfolg wird die Anzahl der geschriebenen Bytes zurückgegeben. Im Fehlerfall wird -1 zurückgegeben.

Hinweis

Im Fehlerfall eines System-Sockets wird, beim Aufruf der Funktion, die Verbindung, die mit SocketConnect erstellt wurde, beendet.

Im Falle eines Fehlers beim Schreiben wird der Fehler 5273 (ERR_NETSOCKET_IO_ERROR) der Variablen _LastError zugewiesen.

Die Funktion kann nur von Expert Advisors und Skripten aufgerufen werden, da sie in ihrem eigenen Ausführungsthread laufen. Wenn sie ein Indikator aufruft, wird von GetLastError() der Fehler 4014 – "Funktionsaufruf ist nicht erlaubt" ausgeworfen.

Beispiel:

//+------------------------------------------------------------------+
//|                                                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 "Fügen Sie die Adresse der Liste mit den erlaubten in der Einstellungen des Terminals hinzu, damit dieses Beispiel funktioniert"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =443;
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart(void)
  {
   int socket=SocketCreate();
//--- Prüfen des Handles
   if(socket!=INVALID_HANDLE)
     {
      //--- wenn alles in Ordnung ist, verbinde
      if(SocketConnect(socket,Address,Port,1000))
        {
         PrintFormat("Established connection to %s:%d",Address,Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- wenn die Verbindung durch ein Zertifikat geschützt ist, zeige dessen Daten an
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("TLS Zertifikat:");
            Print("   Owner:      ",subject);
            Print("   Issuer:     ",issuer);
            Print("   Number:     ",serial);
            Print("   Print:      ",thumbprint);
            Print("   Expiration: ",expiration);
           }
         //--- Senden einer GET-Anforderung an den 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;
           }
         //--- wenn eine sichere TLS-Verbindung über Port 443 verwendet wird
         if(SocketTlsSend(socket,req,len)==len)
           {
            Print("GET-Anforderung gesendet");
            //--- Auslesen der Antwort
            if(!HTTPRecv(socket,1000))
               Print("Fehlerhafte Antwort, Fehler ",GetLastError());
           }
         else
            Print("Fehler bei der GET-Anforderung, Fehler ",GetLastError());
        }
      else
        {
         PrintFormat("Connection to %s:%d failed, error %d",Address,Port,GetLastError());
        }
      //--- Schließen des Sockets nach Verwendungsende
      SocketClose(socket);
     }
   else
      Print("Fehler beim Erstellen des Sockets, Fehler ",GetLastError());
  }
//+------------------------------------------------------------------+
//| Lesen der Antwort vom Server                                     |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout_ms)
  {
//--- Daten aus dem Socket lesen, solange welche vorhanden sind, aber nicht länger als Timeout
   char   rsp[];
   string result;
   ulong  timeout_check=GetTickCount64()+timeout_ms;
 
   do
     {
      uint len=SocketIsReadable(socket);
 
      if(len)
        {
         //--- die Daten einer sicheren TLS-Verbindung lesen und auswerten
         int rsp_len=SocketTlsRead(socket,rsp,len);
 
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- nur den Antwort-Header anzeigen
            int header_end=StringFind(result,"\r\n\r\n");
 
            if(header_end>0)
              {
               Print("Header der HTTP-Antwort erhalten:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
            //--- Ablaufzeit-Aktualisierung der Lesezeitüberschreitung
            timeout_check=GetTickCount64()+timeout_ms;
           }
        }
     }
   while(GetTickCount64()<timeout_check && !IsStopped());
 
   return(false);
  }

Siehe auch

SocketTimeouts, MathSwap, StringToCharArray