SocketRead

Read data from a socket.

int  SocketRead(
   int           socket,               // Socket
   uchar&        buffer[],             // Puffer für die vom Socket gelesenen Daten
   uint          buffer_maxlen,        // Anzahl der zu lesenden Bytes
   uint          timeout_ms            // Timeout für den Lesevorgang
   );

Parameter

socket

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

buffer

[out]  Referenz eines Arrays vom Typ uchar, dem die Daten zugewiesen werden sollen. Die Größe des dynamischen Arrays wird auf die Anzahl der zu lesenden Bytes gesetzt. Die Arraygröße kann INT_MAX (2147483647) nicht überschreiten.

buffer_maxlen

[in]  Anzahl der Bytes, die dem Array buffer[] zugewiesen werden sollen. Daten, die nicht in das Array passen, verbleiben im Socket. Diese können beim nächsten Aufruf von SocketRead abgerufen werden. buffer_maxlen kann nicht größer sein als INT_MAX (2147483647).

timeout_ms

[in]  Timeout für das Lesen der Daten in Millisekunden. Wenn innerhalb dieser Zeitspanne keinen Daten empfangen werden konnten, werden weitere Versuche gestoppt und -1 zurückgegebenen.

Rückgabewert

Bei einem Erfolg wird die Anzahl der gelesenen 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 Lesen 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:

//+------------------------------------------------------------------+
//|                                                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 "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\nUser-Agent: MT5\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());
  }
//+------------------------------------------------------------------+

Siehe auch

SocketTimeouts, MathSwap