SocketConnect

Connette al server con il controllo del timeout.

bool  SocketConnect(
   int           socket,               // socket
   const string  server,               // indirizzo di connessione
   uint          port,                 // porta di connessione
   uint          timeout_receive_ms    // timeout connesione
   );

Pparametri

socket

[in] Il socket handle restituito dalla funzione SocketCreate. Quando viene passato un handle errato, viene scritto l'errore 5270 (ERR_NETSOCKET_INVALIDHANDLE) _LastError.

server

[in] Nome del dominio del server a cui ci si vuole connettere, o il suo indirizzo IP.

port

[in] Numero della porta di connessione.

timeout_receive_ms

[in] Timeout della connessione in millisecondi. Se la connessione non viene stabilita entro tale intervallo di tempo, i tentativi vengono interrotti.

Valore di Ritorno

Se la connessione ha esito positivo, restituisce true, altrimenti false.

Nota

L'indirizzo di connessione deve essere aggiunto all'elenco di quelli consentiti sul lato client (Strumenti\Opzioni\Expert Advisor).

Se la connessione non riesce, viene scritto l'errore 5272 (ERR_NETSOCKET_CANNOT_CONNECT) in _LastError.

La funzione può essere chiamata solo da Expert Advisors e scripts, poiché vengono eseguiti nei relativi thread di esecuzione. Se si chiama da un indicatore, GetLastError() restituisce l'errore 4014 - "Function is not allowed for call (la funzione non è consentita per la chiamata)".

Esempio:

//+------------------------------------------------------------------+
//|                                                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 "Aggiungi indirizzo all'elenco di quelli consentiti nelle impostazioni del terminale per far funzionare l'esempio"
#property script_show_inputs
 
input string Address="www.mql5.com";
input int    Port   =80;
bool         ExtTLS =false;
//+------------------------------------------------------------------+
//| Invia comando al server                                          |
//+------------------------------------------------------------------+
bool HTTPSend(int socket,string request)
  {
   char req[];
   int  len=StringToCharArray(request,req)-1;
   if(len<0)
      return(false);
//--- se viene utilizzata una connessione TLS sicura tramite la porta 443
   if(ExtTLS)
      return(SocketTlsSend(socket,req,len)==len);
//--- se viene utilizzata la connessione TCP standard
   return(SocketSend(socket,req,len)==len);
  }
//+------------------------------------------------------------------+
//| Legge la risposta del server                                     |
//+------------------------------------------------------------------+
bool HTTPRecv(int socket,uint timeout)
  {
   char   rsp[];
   string result;
   uint   timeout_check=GetTickCount()+timeout;
//--- legge i dati dai socket finché sono ancora presenti ma non più lunghi del timeout
   do
     {
      uint len=SocketIsReadable(socket);
      if(len)
        {
         int rsp_len;
         // --- vari comandi di lettura a seconda che la connessione sia sicura o meno
         if(ExtTLS)
            rsp_len=SocketTlsRead(socket,rsp,len);
         else
            rsp_len=SocketRead(socket,rsp,len,timeout);
         // --- analizza la risposta
         if(rsp_len>0)
           {
            result+=CharArrayToString(rsp,0,rsp_len);
            // --- stampa solo l'intestazione della risposta
            int header_end=StringFind(result,"\r\n\r\n");
            if(header_end>0)
              {
               Print("Header risposta HTTP ricevuto:");
               Print(StringSubstr(result,0,header_end));
               return(true);
              }
           }
        }
     }
   while(GetTickCount()<timeout_check && !IsStopped());
   return(false);
  }
//+------------------------------------------------------------------+
//| Funzione Start del programma di script                           |
//+------------------------------------------------------------------+
void OnStart()
  {
   int socket=SocketCreate();
//--- controlla l'handle
   if(socket!=INVALID_HANDLE)
     {
      //--- connetti se tutto va bene
      if(SocketConnect(socket,Address,Port,1000))
        {
         Print("Connessione stabilita a ",Address,":",Port);
 
         string   subject,issuer,serial,thumbprint;
         datetime expiration;
         // --- se la connessione è protetta dal certificato, visualizza i suoi dati
         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;
           }
         // --- invia richiesta GET al server
         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))
           {
            Print("GET request inviata");
            // --- leggi la risposta
            if(!HTTPRecv(socket,1000))
               Print("Impossibile ottenere una risposta, errore ",GetLastError());
           }
         else
            Print("Impossibile inviare la richiesta GET, errore",GetLastError());
        }
      else
        {
         Print("Connessione a ",Address,":",Port," fallita, errore ",GetLastError());
        }
      //--- chiude un socket dopo averlo usato
      SocketClose(socket);
     }
   else
      Print("Impossibile creare un socket, errore ",GetLastError());
  }
//+------------------------------------------------------------------+