SocketIsReadable

Ottieni un numero di byte che può essere letto da un socket.

uint  SocketIsReadable(
   const int  socket      // handle del socket
   );

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).

Valore di Ritorno

Numero di byte che possono essere letti. In caso di errore, viene restituito 0.

Nota

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

Prima di chiamare SocketRead, controlla se il socket contiene dati per la lettura. Altrimenti, se non ci sono dati, la funzione SocketRead attende i dati entro il timeout_ms ritardando l'esecuzione del programma.

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