SocketCreate
指定されたフラグを使ってソケットを作成し、そのハンドルを返します。
int SocketCreate( uint flags ); |
パラメータ
フラグ
[in] ソケットを扱うモードを定義するフラグの組み合わせです。現在サポートされているフラグは、「SOCKET_DEFAULT」1つだけです。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
SocketClose
ソケットを閉じます。
bool SocketClose( const int socket ); |
パラメータ
socket
[in] 閉じられるソケットのハンドルです。ハンドルはSocketCreate関数で戻されます。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
SocketConnect
タイムアウト管理付きでサーバに接続します。
bool SocketConnect( int socket, const string server, uint port, uint timeout_receive_ms ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
server
[in] 接続するサーバのドメイン名またはIPアドレス
port
[in] 接続ポート番号
timeout_receive_ms
[in] ミリ秒単位の接続タイムアウトです。その時間内に接続が確立されないと、試行は中止されます。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
SocketIsConnected
ソケットが現在接続されているかどうかを確認します。
bool SocketIsConnected( const int socket ); |
パラメータ
socket
[in] SocketCreate()関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。
戻り値
注意事項
参照
SocketConnect、SocketIsWritable、SocketCreate、 SocketClose
SocketIsReadable
ソケットから読み込めるバイト数を取得します。
uint SocketIsReadable( const int socket ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。
戻り値
注意事項
例:
//+——————————————————————+ //| 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; //+——————————————————————+ //| サーバにコマンドを送信 &nbnbsp; | //+——————————————————————+ bool HTTPSend(int socket,string request) { char req[]; int len=StringToCharArray(request,req)-1; if(len<0) return(false); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
SocketIsWritable
現在の時点でデータをソケットに書き込めるかどうかを確認します。
bool SocketIsWritable( const int socket ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
戻り値
注意事項
SocketTimeouts
ソケットシステムオブジェクトのデータを送受信するためのタイムアウトを設定します。
bool SocketTimeouts( int socket, uint timeout_send_ms, uint timeout_receive_ms ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
timeout_send_ms
[in] ミリ秒単位のデータ送信タイムアウト
timeout_receive_ms
[in] ミリ秒単位のデータ受信タイムアウト<.
戻り値
注意事項
SocketRead
ソケットからデータを読みます。
int SocketRead( int socket, uchar& buffer[], uint buffer_maxlen, uint timeout_ms ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。
buffer
[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。
buffer_maxlen
[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。
timeout_ms
[in] ミリ秒単位の読み込みタイムアウトです。この時間内にデータが取得されない場合、試行は中止され、関数は-1を返します。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
参照
SocketTimeouts、MathSwap
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] 「buffer」配列サイズ
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
参照
SocketTimeouts、MathSwap、StringToCharArray
SocketTlsHandshake
TLS Handshakeプロトコルを介して指定されたホストへの安全なTLS(SSL)接続を開始します。ハンドシェイク中、クライアントとサーバは接続パラメータ、つまり適用されるプロトコルのバージョンとデータの暗号化方式について合意します。
bool SocketTlsHandshake( int socket, const string host ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
host
[in] 安全な接続が確立されているホストのアドレス
戻り値
注意事項
SocketTlsCertificate
ネットワーク接続を保護するために使用される証明書に関するデータを取得します。
int SocketTlsCertificate( int socket, string& subject, string& issuer, string& serial, string& thumbprint, datetime& expiration ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
subject
[in] 証明書所有者名。Subjectフィールドに対応します。
issuer
[in] 証明書所有者名。Issuerフィールドに対応します。
serial
[in] 証明書のシリアル番号。SerialNumberフィールドに対応します。
thumbprint
[in] 証明書プリント。証明書ファイル全体(発行者の署名を含むすべてのフィールド)のSHA-1ハッシュに対応します。
expiration
[in] datetime形式での証明書の有効期限。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
SocketTlsRead
安全なTLS接続からデータを読み込みます。
int SocketTlsRead( int socket, uchar& buffer[], uint buffer_maxlen ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。
buffer
[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。
buffer_maxlen
[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketTLSReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。
戻り値
注意事項
例:
//+——————————————————————+ //| 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); //— 安全なTLS接続がポート443を使用する場合 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\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()); } //+——————————————————————+ |
参照
SocketTimeouts、MathSwap
SocketTlsReadAvailable
安全なTLS接続からすべてのデータを読み込みます。
int SocketTlsReadAvailable( int socket, uchar& buffer[], const uint buffer_maxlen ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。 _LastErrorに無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)がアクティブになります。
buffer
[out] データが読まれるuchar型配列への参照。動的配列サイズは、読み取られたバイト数だけ増えます。配列サイズはINT_MAX (2147483647)を超えることはできません。
buffer_maxlen
[in] buffer[]配列に読まれるバイト数。配列に収まらないデータはソケットに残り、次のSocketTlsReadAvailableまたはSocketTlsReadの呼び出しで受信できます。buffer_maxlenはINT_MAX (2147483647)を超えることはできません。
戻り値
注意事項
参照
SocketTimeouts、MathSwap
SocketTlsSend
安全なTLS接続を介してデータを送信します。
int SocketTlsSend( int socket, const uchar& buffer[], uint buffer_len ); |
パラメータ
socket
[in] SocketCreate関数で返されるソケットハンドルです。無効なハンドルが渡されると、5270 (ERR_NETSOCKET_INVALIDHANDLE)が_LastErrorに書かれます。
buffer
[in] データが送信されるuchar型配列への参照
buffer_len
[in] 「buffer」配列サイズ
戻り値
注意事項
参照
SocketTimeouts、MathSwap、StringToCharArray
WebRequest
この関数は指定されたサーバにHTTP要求を送信します。この関数には 2 つのバージョンがあります。
1ヘッダの Content-Type: application/x-www-form-urlencoded を使用して型「key=value」の単純なリクエストを送信します。
int WebRequest( const string method, const string url, const string cookie, const string referer, int timeout, const char &data[], int data_size, char &result[], string &result_headers ); |
2. 様々なWebサービスとのより柔軟な相互作用のためにカスタムヘッダセットを指定して任意の型のリクエストを送ります
int WebRequest( const string method, const string url, const string headers, int timeout, const char &data[], char &result[], string &result_headers ); |
パラメータ
method
[in] HTTP メソッド
url
[in] URL
headers
[in] 「 \r\n」 で改行された「key: value」型のリクエストヘッダ
cookie
[in] クッキー値
referer
[in] HTTPリクエストのRefererヘッダー値
timeout
[in] ミリ秒単位のタイムアウト
data[]
[in] HTTPメッセージ本文の配列
data_size
[in] data[] 配列のサイズ
result[]
[out] サーバ応答データを含む配列
result_headers
[out] サーバ応答ヘッダ
戻り値
注意事項
例:
void OnStart() { string cookie=NULL,headers; char post[],result[]; string url="https://finance.yahoo.com"; //— サーバへのアクセスを有効にするには、URL "https://finance.yahoo.com"を //— メインメニュ->ツール->オプションの 「エキスパートアドバイザー(EA)」タブの許可されたURLのリストに追加する必要がある //— 最後のエラーコードのリセット ResetLastError(); //— Yahoo!ファイナンスからhtmlページを読み込む int res=WebRequest("GET",url,cookie,NULL,500,post,0,result,headers); if(res==-1) { Print("Error in WebRequest. Error code =",GetLastError()); //— おそらくURLがリストされていないので、アドレスを追加する必要についてのメッセージを表示する MessageBox("Add the address '"+url+"' to the list of allowed URLs on tab 'Expert Advisors'","Error",MB_ICONINFORMATION); } else { if(res==200) { //— ダウンロード成功 PrintFormat("The file has been successfully downloaded, File size %d byte.",ArraySize(result)); //PrintFormat("Server headers: %s",headers); //— ファイルでのデータ保存 int filehandle=FileOpen("url.htm",FILE_WRITE|FILE_BIN); if(filehandle!=INVALID_HANDLE) { //— result[] 配列の内容のファイルでの保存 FileWriteArray(filehandle,result,0,ArraySize(result)); //— ファイルを閉じる FileClose(filehandle); } else Print("Error in FileOpen. Error code =",GetLastError()); } else PrintFormat("Downloading '%s' failed, error code %d",url,res); } } |
SendFTP
「FTP」タブの設定ウィンドウで指定されたアドレスにファイルを送信します。
bool SendFTP( string filename, string ftp_path=NULL ); |
パラメータ
filename
[in] 送られたファイルの名称
ftp_path=NULL
[in] FTP カタログディレクトリが指定されていない場合は、設定に記載されたディレクトリが使用されます。
戻り値
注意事項
SendMail
「メール」タブの設定ウィンドウで指定されたアドレスに電子メールを送信します。
bool SendMail( string subject, string some_text ); |
パラメータ
subject
[in] メールヘッダ
some_text
[in] メール本文
戻り値
注意事項
SendNotification
MetaQuotes ID が「通知」タブで指定されているモバイル端末にプッシュ通知を送信します。
bool SendNotification( string text ); |
パラメータ
text
[in] 通知テキストメッセージの長さは 255 文字を超えることは出来ません。
戻り値
- 4515 – ERR_NOTIFICATION_SEND_FAILED,
- 4516 – ERR_NOTIFICATION_WRONG_PARAMETER,
- 4517 – ERR_NOTIFICATION_WRONG_SETTINGS,
- 4518 – ERR_NOTIFICATION_TOO_FREQUENT.
注意事項
Originally posted 2019-07-30 09:27:36.