このライブラリ(winhttp.dll)は、PingやPongのための関数を公開していません。ドキュメントでは、接続を維持する方法を制御するコンフィギュレーション・オプションに 言及していますが。私は、このライブラリは、接続がアイドル状態のときに自動的にPingを送信すると考えています。
#include<websocket.mqh> #include<JAson.mqh> #define BINANCE_URL "fstream.binance.com:443/ws" CWebsocket websocket; //websocket client CJAVal m_jv; //utility json object //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- create timer EventSetTimer(1); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- destroy timer EventKillTimer(); } //+------------------------------------------------------------------+ //| Timer function | //+------------------------------------------------------------------+ void OnTimer() { if(!websocket.Connect(BINANCE_URL)) { Print(websocket.LastErrorMessage()," : ",websocket.LastError()); return; } else { Print("Connected"); } } //+------------------------------------------------------------------+
接続できるかどうか確認 したいのですが、接続時にエラーが発生します。
エラーです。Win32 API エラー 6 : 6
なぜこのようなエラーが発生するのでしょうか?
ありがとうございます。
エラーです。Win32 API エラー 6 : 6
なぜこのようなエラーが発生するのでしょうか?
ありがとうございます。
私はそれがローカルホスト127.0.0.1に接続するために使用されるとき、mql5上で同じ問題を抱えている。しかし、私はmql4でそれを使用しようとしたとき、それは正常に動作しました!!!。
また、OnTimerイベントでWinHttpSocketReceive()を使用すると、ターミナルがフリーズしてしまうという問題があります。
私はnodeJS ExpressとWSライブラリを使用して独自のWSサーバを構築し、onClickイベントハンドラでReceive関数を追加すると、サーバへの送信とサーバからの受信に成功しました , これは、 winhttp.sll::WinHttpSocketReceive() が非同期に動作するという事実のためです。
つまり、サーバーから何らかのデータを受信するまで、この関数は返さないということです。そのため、サーバーからデータを送信することなく、onTimer()で直接使用すると、スレッドが永遠にブロックされ、ターミナルがフリーズする原因となります。
そのため、WinHttpSocketReceive()は、サーバーからデータがある場合にはうまく動作します。しかし、一方では、同じ関数がOnTimer()イベントハンドラの内部で使用されている場合、それは端末がフリーズしています。誰もがそれを回避する方法についての手がかりを持っていますか?
これは、"ブロック "メソッド/関数の呼び出しであり、ここで修正することは何もありません。
私はそれがスレッドをブロックする同期関数であることを知っている , しかし、私はWinnHttpOpen() 関数にWINHTTP_FLAG_ASYNCを 追加することによって、非同期にそれを使用して管理することができました それはコードの残りの部分をブロックしません , しかし私は WinHttpSetStatusCallBack() msdnに従っている追加によって上昇した別の問題に直面して , 我々は使用しなければならない WinHTTP_FLAG_ASYNC ( )。これは、結果を受信するコールバック関数へのポインタを取る。
私はtypedefを 使用して、このように関数へのポインタを定義します。
typedef void(*WINHTTP_STATUS_CALLBACK)(HINTERNET,DWORD&,DWORD,BYTE &[],DWORD);
そして、私はmsdnに従ってwinhttp.dllからWinHttpSetStatusCallBack()をインポートしました。
https://docs.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpsetstatuscallback
#import WINHTTP_STATUS_CALLBACK WinHttpSetStatusCallback(HINTERNET hInternet,WINHTTP_STATUS_CALLBACK lpfnInternetCallback,DWORD dwNotificationFlags,DWORD &dwReserved); #import
私はコンパイルするとき、私はポインタがインポート文に許可されていないというエラーメッセージが表示されます!!!だから、この関数へのコールバックだけでなく、その関数への戻り値のポインタを渡す方法はありません!どんなアイデアですか?
- 2021.10.13
- stevewhims
- docs.microsoft.com
@Francis Dube WebSocketサーバーとして動作するMQL5サービスを作成することは可能ですか?何か例はありますか?
- 無料取引アプリ
- 8千を超えるシグナルをコピー
- 金融ニュースで金融マーケットを探索
新しい記事「MetaTrader 5のWebSocket — WindowsAPIの使用」はパブリッシュされました:
この記事では、WinHttp.dllを使用してMetaTrader 5プログラム用のWebSocketクライアントを作成します。クライアントは最終的にクラスとして実装され、Binary.com WebSocketAPIに対してもテストされます。
作者: Francis Dube