SocketIsConnected

Vérifie si la socket est actuellement connectée.

bool  SocketIsConnected(
   const int  socket      // handle de la socket
   );

Paramètres

socket

[in]  Handle de la socket retourné par la fonction SocketCreate(). Lorsqu'un handle incorrect est passé à _LastError, l'erreur 5270 (ERR_NETSOCKET_INVALIDHANDLE) est activée.

Valeur de Retour

Retourne true si la socket est connectée, sinon false.

Note

La fonction SocketIsConnected() permet de vérifier le statut actuel de connexion de la socket.

La fonction ne peut être appelée que depuis les Expert Advisors et les scripts, puisqu'ils sont exécutés dans leurs propres threads d'exécution. Si elle est appelée depuis un indicateur, GetLastError() retourne l'erreur 4014 — "Function is not allowed for call".

Exemple :

//+------------------------------------------------------------------+
//|                                            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 "Add Address to the list of allowed ones in the terminal settings to let the example work"
#property script_show_inputs
 
input string Address    ="www.mql5.com";
input int    Port       =80;
input bool   CloseSocket=true;
bool         ExtTLS     =false;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(void)
  {
//--- crée une socket et récupère son handle
   int socket=SocketCreate();
//--- vérifie le handle
   if(socket!=INVALID_HANDLE)
     {
      //--- on se connecte si tout est bon
      if(SocketConnect(socket,Address,Port,1000))
        {
         PrintFormat("Established connection to %s:%d",Address,Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la connexion est protégée par un certificat, affiche ses données
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("TLS certificate:");
            Print("   Owner:      ",subject);
            Print("   Issuer:     ",issuer);
            Print("   Number:     ",serial);
            Print("   Print:      ",thumbprint);
            Print("   Expiration: ",expiration);
            ExtTLS=true;
           }
         //--- envoie une requête GET au serveur
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))
           {
            Print("GET request sent");
            //--- lit la réponse
            if(!HTTPRecv(socket,1000))
               Print("Failed to get a response, error ",GetLastError());
           }
         else
            Print("Failed to send GET request, error ",GetLastError());
        }
      else
        {
         PrintFormat("Connection to %s:%d failed, error %d",Address,Port,GetLastError());
        }
      //--- si le flag est positionné, ferme la socket après son utilisation
      if(CloseSocket)
         SocketClose(socket);
     }
   else
      Print("Failed to create a socket, error ",GetLastError());
 
//--- vérifie la connexion au serveur
   bool connected=SocketIsConnected(socket);
//--- termine l'opération s'il n'y a pas de connexion
   if(!connected)
     {
      Print("No connection to server");
     }
//--- si la connexion au serveur est établie
   else
     {
      Print("Connection to the server is available\nThe connection needs to be closed. Closing");
      //--- ferme la socket et vérifie à nouveau le statut de la connexion
      SocketClose(socket);
      connected=SocketIsConnected(socket);
     }
 
//--- affiche le statut actuel de la connexion au serveur
   Print("Currently connected: ",(connected ? "opened" : "closed"));
   /*
   Résultat dans le cas où CloseSocket = true:
   No connection to server
   Currently connectedclosed
 
   Résultat dans le cas où CloseSocket = false:
   Connection to the server is available
   The connection needs to be closedClosing
   Currently connectedclosed
   */
  }
//+------------------------------------------------------------------+
//| Send command to server                                           |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
//--- convertit la chaîne en un tableau de caractères, ignore le zéro de fin
   char req[];
   int  len=StringToCharArray(request,req)-1;
 
   if(len<0)
      return(false);
//--- si une connexion TLS sécurisée via le port 443 est utilisée
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- si une connexion TCP standard est utilisée
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Read server response                                             |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout_ms)
  {
   char   rsp[];
   string result;
   ulong  timeout_check=GetTickCount64()+timeout_ms;
//--- lit les données depuis la socket tant qu'il y en a, mais pas plus longtemps que le délai d'attente
   do
     {
      uint len=SocketIsReadable(socket);
 
      if(len)
        {
         int rsp_len;
         //--- commandes de lecture différentes selon que la connexion est sécurisée ou non
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout_ms);
         //--- parcours la réponse
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- affiche uniquement l'en-tête de la réponse
            int header_end=StringFind(result,"\r\n\r\n");
 
            if(header_end>0)
              {
               Print("HTTP answer header received:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
            //--- met à jour le délai d'expiration du délai de lecture
            timeout_check=GetTickCount64()+timeout_ms;
           }
        }
     }
   while(GetTickCount64()<timeout_check && !IsStopped());
 
   return(false);
  }

Voir également

SocketConnect, SocketIsWritable, SocketCreate, SocketClose