SocketSend

将数据写入套接。

int  SocketSend(

   int           socket,               // 套接

   const uchar&  buffer[],             // 数据缓冲区

   uint          buffer_len            // 缓冲区大小

   );

参数

socket

[in]  套接句柄通过SocketCreate函数返回。当传递不正确的句柄时,错误号5270 (ERR_NETSOCKET_INVALIDHANDLE)会被写入_LastError

buffer

[in]  通过即将发送至套接的数据,引用uchar类型数组。

buffer_len

[in]  “缓冲区”数组大小。

返回值

如果成功,返回写入套接的字节数。错误的话,返回-1。

注意

如果执行函数时系统套接发生错误,那么通过SocketConnect建立的连接则中断。

如果数据写入错误,错误号5273 (ERR_NETSOCKET_IO_ERROR)会被写入_LastError

这个函数只能从EA交易和脚本中调用,因为它们在自己的执行线程中运行。如果从指标调用,GetLastError()则返回4014错误号– “函数不允许调用”。

例如:

//+------------------------------------------------------------------+

//|                                                SocketExample.mq5 |

//|                        Copyright 2018, MetaQuotes Software Corp. |

//|                                             https://www.mql5.com |

//+------------------------------------------------------------------+

#property copyright   "Copyright 2018, MetaQuotes Software Corp."

#property link        "https://www.mql5.com"

#property version     "1.00"

#property description "Add Address to the list of allowed ones in the terminal settings to let the example work"

#property script_show_inputs



input string Address="www.mql5.com";

input int    Port   =80;

bool         ExtTLS =false;

//+------------------------------------------------------------------+

//| 向服务器发送命令                                                   |

//+------------------------------------------------------------------+

bool HTTPSend(int socket,string request)

  {

   char req[];

   int  len=StringToCharArray(request,req)-1;

   if(len<0)

      return(false);

//--- 如果通过443端口使用安全TLS连接

   if(ExtTLS)

      return(SocketTlsSend(socket,req,len)==len);

//--- 如果使用标准的TCP连接

   return(SocketSend(socket,req,len)==len);

  }

//+------------------------------------------------------------------+

//| 读取服务器响应                                                     |

//+------------------------------------------------------------------+

bool HTTPRecv(int socket,uint timeout)

  {

   char   rsp[];

   string result;

   uint   timeout_check=GetTickCount()+timeout;

//--- 读取套接数据,直至套接数据不长过超时且仍然存在

   do

     {

      uint len=SocketIsReadable(socket);

      if(len)

        {

         int rsp_len;

         //--- 各种读取命令,取决于连接是否安全

         if(ExtTLS)

            rsp_len=SocketTlsRead(socket,rsp,len);

         else

            rsp_len=SocketRead(socket,rsp,len,timeout);

         //--- 分析响应

         if(rsp_len>0)

           {

            result+=CharArrayToString(rsp,0,rsp_len);

            //--- 只打印响应标题

            int header_end=StringFind(result,"\r\n\r\n");

            if(header_end>0)

              {

               Print("HTTP answer header received:");

               Print(StringSubstr(result,0,header_end));

               return(true);

              }

           }

        }

     }

   while(GetTickCount()<timeout_check && !IsStopped());

   return(false);

  }

//+------------------------------------------------------------------+

//| 脚本程序起始函数                                                   |

//+------------------------------------------------------------------+

void OnStart()

  {

   int socket=SocketCreate();

//--- 检查句柄

   if(socket!=INVALID_HANDLE)

     {

      //--- 一切顺利情况下继续连接

      if(SocketConnect(socket,Address,Port,1000))

        {

         Print("Established connection to ",Address,":",Port);



         string   subject,issuer,serial,thumbprint;

         datetime expiration;

         //--- 如果连接受到证书保护,则显示其数据

         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;

           }

         //--- 向服务器发送GET请求

         if(HTTPSend(socket,"GET / HTTP/1.1\r\nHost: www.mql5.com\r\nUser-Agent: MT5\r\n\r\n"))

           {

            Print("GET request sent");

            //--- 读取响应

            if(!HTTPRecv(socket,1000))

               Print("Failed to get a response, error ",GetLastError());

           }

         else

            Print("Failed to send GET request, error ",GetLastError());

        }

      else

        {

         Print("Connection to ",Address,":",Port," failed, error ",GetLastError());

        }

      //--- 用后关闭套接

      SocketClose(socket);

     }

   else

      Print("Failed to create a socket, error ",GetLastError());

  }

//+------------------------------------------------------------------+

另见

SocketTimeoutsMathSwapStringToCharArray