SocketClose

Ferme une socket.

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

Parameters

socket

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

Valeur de Retour

Retourne true en cas de succès, sinon false.

Note

Si une connexion via SocketConnect avait été créée auparavant pour une socket, elle est interrompue.

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());
  }
//+------------------------------------------------------------------+