SocketSend

Scrivi dati su un socket.

int  SocketSend(
   int           socket,               // socket
   const uchar&  buffer[],             // buffer dati
   uint          buffer_len            // grandezza buffer
   );

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.

buffer

[in] Riferimento array di tipo uchar con i dati da inviare al socket.

buffer_len

[in] grandezza dell'array 'buffer'.

Valore di Ritorno

In caso di successo, restituisce il numero di byte scritti su un socket. 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 scrittura dei dati, viene scritto l'errore 5273 (ERR_NETSOCKET_IO_ERROR) 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, StringToCharArray