SocketCreate

Erstellen eines Sockets mit den angegebenen Flags und der Rückgabe des Handles.

int  SocketCreate(
   uint     flags         // Flags
   );

Parameter

flags

[in]  Kombination der Flags, die den Arbeitsmodus des Sockets festlegt. Aktuell wird nur ein Flag unterstützt — SOCKET_DEFAULT.

Rückgabewert

Im Falle eines erfolgreichen Erstellens des Sockets, wird das Handle zurückgegeben, andernfalls INVALID_HANDLE.

Hinweis

Um den Computerspeicher eines unbenutzten Sockets freizugeben, rufen Sie SocketClose auf.

Sie können maximal 128 Sockets aus einem MQL5-Programm erstellen. Wird das Limit überschritten, wird der Fehler 5271 (ERR_NETSOCKET_TOO_MANY_OPENED) 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:

//+------------------------------------------------------------------+
//|                                                SocketExample.mq5 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright   "Copyright 2018, MetaQuotes Software Corp."
#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   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Einen Befehl zum Server schicken                                 |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- Wenn eine sichere TLS-Verbindung über den Port 443 verwendet wird
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- Wenn eine standardmäßige TCP-Verbindung verwendet wird
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lesen der Antwort vom Server                                     |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- Lesen der Daten vom Socket solange es welche gibt, aber nicht länger als der Timeout dauert
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- Verschiedene Lesebefehle, je nach dem, ob die Verbindung eine sichere ist oder nicht
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- Analysieren der Antwort
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- Ausdruck nur des Headers der Antwort
            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);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- Prüfen des Handles
   if(socket!=INVALID_HANDLE)
     {
      //--- Verbinden, wenn alles ok ist
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Verbindung hergestellt mit ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- Wenn die Verbindung mit einem Zertifikat gesichert ist, zeige dessen Daten
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("TLS Zertifikat:");
            Print("   Besitzer:  ",subject);
            Print("   Aussteller:  ",issuer);
            Print("   Seriennummer:     ",serial);
            Print("   Ausdruck: ",thumbprint);
            Print("   Ablaufdatum: ",expiration);
            ExtTLS=true;
           }
         //--- Senden einer GET-Anforderung an den Server
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\n\r\n"))
           {
            Print("GET-Anforderung gesendet");
            //--- Lesen der Antwort
            if(!HTTPRecv(socket,1000))
               Print("Fehlerhafte Antwort, Fehler ",GetLastError());
           }
         else
            Print("Fehler bei der GET-Anforderung, Fehler ",GetLastError());
        }
      else
        {
         Print("Verbindung mit ",Address,":",Port," schlug fehl, Fehler ",GetLastError());
        }
      //--- Schließen des Sockets nach dem Ende der Verwendung
      SocketClose(socket);
     }
   else
      Print("Fehler beim Erstellen des Sockets, Fehler ",GetLastError());
  }
//+------------------------------------------------------------------+