SocketRead

Legge i dati da un socket.

int  SocketRead(
   int           socket,               // socket
   uchar&        buffer[],             // buffer per la lettura dei dati dal socket
   uint          buffer_maxlen,        // numero di byte da leggere
uinttimeout_ms// timeout lettura
   );

Pparametri

socket

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

buffer

[out] Riferimento all'array di tipo uchar in cui vengono letti i dati. La dimensione dinamica dell'array è aumentata dal numero di byte letti. La dimensione dell'array non può superare INT_MAX (2147483647).

buffer_maxlen

[in] Numero di byte da leggere nell'arraybuffer[]. I dati non adattati all'array rimangono nel socket. Possono essere ricevuti dalla prossima chiamata SocketRead. buffer_maxlen cannot exceed INT_MAX (2147483647).

timeout_ms

[in] Tempo di lettura dei dati in millisecondi. Se i dati non vengono ottenuti entro questo tempo, i tentativi vengono interrotti e la funzione restituisce -1.

Valore di Ritorno

Se ha successo, restituisce il numero di byte letti. In caso di errore, viene restituito -1.

Nota

Se si verifica un errore su un socket di sistema durante l'esecuzione della funzione, la connessione stabilita tramite SocketConnect viene interrotta.

In caso di errore di lettura dei dati, l'errore 5273 (ERR_NETSOCKET_IO_ERROR) viene scritto 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());
  }
//+------------------------------------------------------------------+

Guarda anche

SocketTimeouts, MathSwap