SocketConnect

Connexion au serveur avec un contrôle du timeout.

bool  SocketConnect(
   int           socket,               // socket
   const string  server,               // adresse de connexion
   uint          port,                 // port de connexion
   uint          timeout_receive_ms    // timeout de connexion
   );

Parameters

socket

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

server

[in]  Nom de domaine du serveur auquel vous voulez vous connecter ou son adresse IP.

port

[in]  Numéro du port.

timeout_receive_ms

[in]  Timeout en millisecondes. Si la connexion n'est pas établie dans cet intervalle de temps, les tentatives sont stoppées.

Valeur de Retour

Si la connexion est réussie, retourne true, sinon false.

Note

L'adresse de connexion doit être ajoutée à la liste des adresses autorisées dans le terminal client (Outils \ Options \ Expert Advisors).

Si la connexion échoue, l'erreur 5272 (ERR_NETSOCKET_CANNOT_CONNECT) est écrite dans _LastError.

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 appelé depuis un indicateur, GetLastError() retourne l'erreur 4014 — "Function is not allowed for call".

Exemple :

//+------------------------------------------------------------------+
//|                                                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 "Ajoute une adresse à la liste des adresses autorisées dans les paramètres du terminal pour faire fonctionner l'exemple"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Envoi une commande au serveur                                    |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- si la connexion TLS sécurisée est utilisée via le port 443
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- si la connexion TCP standard est utilisée
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Lit la réponse du serveur                                        |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- lit les données des sockets tant qu'il y en a et juqu'au timeout
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         //--- différentes commandes de lecture suivant que la connexion est sécurisée ou pas
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         //--- analyse la réponse
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            //--- n'affiche que l'en-tete de la réponse
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("En-tete de la réponse HTTP reçue :");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- vérifie le handle
   if(socket!=INVALID_HANDLE)
     {
      //--- connexion si tout est ok
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Connexion établie avec ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         //--- si la connexion est sécurisée par un certificat, affiche ses données
         if(SocketTlsCertificate(socket,subject,issuer,serial,thumbprint,expiration))
           {
            Print("Certificat TLS :");
            Print("   Propriétaire :  ",subject);
            Print("   Emetteur :  ",issuer);
            Print("   Numéro :     ",serial);
            Print("   Print : ",thumbprint);
            Print("   Expiration : ",expiration);
            ExtTLS=true;
           }
         //--- envoi une requete GET au serveur
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))
           {
            Print("Requête GET envoyée");
            //--- lit la réponse
            if(!HTTPRecv(socket,1000))
               Print("Echec d'obtention d'une réponse, erreur ",GetLastError());
           }
         else
            Print("Echec d'envoi de la requete GET, erreur ",GetLastError());
        }
      else
        {
         Print("Connexion à ",Address,":",Port," échouée, erreur ",GetLastError());
        }
      //--- ferme la socket après son utilisation
      SocketClose(socket);
     }
   else
      Print("Echec de création de la socket, erreur ",GetLastError());
  }
//+------------------------------------------------------------------+