SocketIsWritable

Prüfung, ob jetzt Daten auf einen Socket geschrieben werden können.

bool  SocketIsWritable(
   const int  socket      // Handle des Sockets
   );

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.

Rückgabewert

Gibt true zurück, wenn das Schreiben möglich ist, andernfalls false.

Hinweis

Die Funktion erlaubt zu prüfen, ob Daten jetzt auf den Socket geschrieben werden können.

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

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:  

//+------------------------------------------------------------------+
//|                                             SocketIsWritable.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       =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Skript Programm Start Funktion                                   |
//+------------------------------------------------------------------+
void OnStart(void)
  {
//--- Socket erstellen und sein Handle zuweisen
   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);
            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");
            //--- 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());
        }
      //--- im Journal die Möglichkeit anzeigen, ob Daten zum aktuellen Zeitpunkt auf das Socket geschrieben werden können
      if(SocketIsWritable(socket))
         Print("At the current moment in time, writing data to the socket is possible");
      else
         Print("It is not possible to write data to the socket at the current time");
      //--- Schließen des Sockets nach Verwendungsende
      if(SocketClose(socket))
         Print("Now the socket is closed");
     }
   else
      Print("Fehler beim Erstellen des Sockets, Fehler ",GetLastError());
   /*
   Ergebnis:
   At the current moment in timewriting data to the socket is possible
   Socket is closed now
   */
  }
//+------------------------------------------------------------------+
//| Befehl zum Server senden                                         |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
//--- Umwandeln der Zeichenkette in ein Zeichenarray mit dem Löschen der abschließenden Null
   char req[];
   int  len=StringToCharArray(request,req)-1;
 
   if(len<0)
      return(false);
//--- wenn eine sichere TLS-Verbindung über Port 443 verwendet wird
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- wenn eine normale TCP-Verbindung verwendet wird
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lesen der Antwort vom Server                                     |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout_ms)
  {
   char   rsp[];
   string result;
   ulong  timeout_check=GetTickCount64()+timeout_ms;
//--- Daten aus dem Socket lesen, solange welche vorhanden sind, aber nicht länger als Timeout
   do
     {
      uint len=SocketIsReadable(socket);
 
      if(len)
        {
         int rsp_len;
         //--- unterschiedliche Lesebefehle, je nachdem, ob die Verbindung sicher ist oder nicht
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout_ms);
         //--- Auswerten der Antwort
         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);
  }