SocketIsConnected

Prüft, ob der Socket aktuell verbunden ist.

bool  SocketIsConnected(
   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 bei einer gültigen Verbindung, andernfalls false.

Hinweis

Die Funktion SocketIsConnected() erlaubt die Überprüfung der aktuellen Verbindung des Sockets.

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:

//+------------------------------------------------------------------+
//|                                            SocketIsConnected.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;
input bool   CloseSocket=true;
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());
        }
      //--- wenn das Flag gesetzt ist, schließe den Socket nach Gebrauch
      if(CloseSocket)
         SocketClose(socket);
     }
   else
      Print("Fehler beim Erstellen des Sockets, Fehler ",GetLastError());
 
//--- Prüfen der Serververbindung
   bool connected=SocketIsConnected(socket);
//--- Beenden des Vorgangs, wenn es keine Verbindung gibt
   if(!connected)
     {
      Print("No connection to server");
     }
//--- wenn eine Serververbindung besteht
   else
     {
      Print("Connection to the server is available\nThe connection needs to be closed. Closing");
      //--- Schließen des Sockets und erneutes Überprüfen des Verbindungsstatus
      SocketClose(socket);
      connected=SocketIsConnected(socket);
     }
 
//--- den aktuellen Status der Serververbindung anzeigen
   Print("Currently connected: ",(connected ? "opened" : "closed"));
   /*
   result in case CloseSocket = true:
   No connection to server
   Currently connectedclosed
 
   result in case CloseSocket = false:
   Connection to the server is available
   The connection needs to be closedClosing
   Currently connectedclosed
   */
  }
//+------------------------------------------------------------------+
//| 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);
  }

Siehe auch

SocketConnect, SocketIsWritable, SocketCreate, SocketClose