Binance Crypyto Exhange Exhange مثال داده های بازار. SSL WebSocket.#2159

ساخت وبلاگ

سلام ، اول ممنون از کتابخانه. من زیر کد آزمون اصلاح شده از مثالها را نوشتم ، و اطلاعات مفیدی که در مورد برخی از لینک های شماره پیدا کردم. این تست با قیمت بیت کوین در Binance Exchange مشترک شده و به روزرسانی قیمت را به کنسول چاپ می کند. همچنین از خرابی شبکه بازیابی می شود (می توانید کابل شبکه را از بین ببرید / جایگزین کنید).

نمونه های Async برای من کاملاً پیچیده به نظر می رسند و با تمام زنجیرهای تماس برگشتی و غیره برای اجرای این پرونده کمی مشکل به نظر می رسد. آیا این کد خوب است ، آیا می توانید مشکلی را مشاهده کنید؟آیا روش بهتری برای انجام این کار با روشهای ASYNC وجود دارد؟

// // کپی رایت (ج) 2016-2019 Vinnie Falco (Vinnie Dot Falco در Gmail dot com) // // تحت مجوز نرم افزار Boost ، نسخه 1. 0 توزیع شده است.(به همراهی // file inserve_1_0. txt مراجعه کنید یا در http://www. boost. org/license_1_0. txt) کپی کنید // // مخزن رسمی: https://github. com/boostorg/beast // #include "./root_certificates. hpp "#include #include #include #include #include #include #include #include #include #include #include namespace beast = تقویت :: جانور ؛// از فضای نام http = beast :: http ؛// از Namespace WebSocket = Beast :: WebSocket ؛// از namespace net = تقویت :: asio ؛// از namespace ssl = تقویت :: asio :: ssl ؛// از استفاده از TCP = BOOST :: ASIO :: IP :: TCP ؛// از // کلاس برای اتصال به یک نقطه پایانی WebSocket و دریافت داده ها به طور مداوم CONTARTY بسته می شود یا به صورت دستی کلاس WebSocketsession را متوقف می کند: std عمومی :: Enable_shared_from_this>_ws ؛Beast :: flat_buffer _buffer ؛std :: string _host ؛std :: string _hostandport ؛char const * _port ؛std :: string _target ؛std :: string _text ؛TCP :: نقطه پایانی _tcpendpoint ؛bool _terminate = false ؛Void ConnectAndReceive ()next_layer (). native_handle () ، _host. c_str ()) // Update the _host string. This will provide the value of the // Host HTTP header during the WebSocket handshake. // See https://tools.ietf.org/html/rfc7230#section-5.4 _hostAndPort = _host + ':' + std::to_string(_tcpEndPoint.port()); // Perform the SSL handshake _ws>next_layer().handshake(ssl::stream_base::client); // Set a decorator to change the User-Agent of the handshake _ws>set_option (websocket :: stream_base :: دکوراتور ([] (websocket :: request_type و req))); // Perform the websocket handshake _ws>دست دستی (_hostandport ، _target) ؛// پیام های خواندن را امتحان کنیدread(_buffer); if (_buffer.size()>0)دیگر<_ws>close(boost::beast::websocket::close_code::normal);>>>Catch (Beast :: System_Error Const & SE)گرفتن (std :: استثنا و سابق)عمومی: // حل کننده و سوکت نیاز به یک وب سایت صریح IO_Context (خالص :: io_context & ioc ، ssl :: context & ctx ، char const* host ، char const* char const* target): _iocontext (ioc) ، _sslContext (ctx)، _tcpresolver (_iocontext) ، _host (میزبان) ، _port (پورت) ، _target (هدف) ، _hostandport ()<>Void Stop ()<_terminate = true;>شروع باطل ()>(_iocontext ، _sslContext) ؛تلاش كردنCatch (Beast :: System_Error Const & SE) //if we get to here process has been terminated>>؛// ---------------------------------------------------------------------------------------- int Main (int argc ، char ** argv)؛ctx. set_verify_mode (ssl :: verify_none) ؛// این گواهی ریشه مورد استفاده برای تأیید LOAD_ROOT_CERTIFICATES (CTX) است.// سرویس I/O را اجرا کنید. هنگامی که // سوکت بسته است ، تماس برمی گردد. ioc. run () ؛std :: string inputStr ؛std :: موضوع t ؛std :: shared_ptr WebSocketsession ؛در حالی که (inputStr! = "x")inputStr ؛if (inputStr == "r")Start(); //within a thread so doesn't block>);>>دیگری اگر (inputStr == "s" || inputStr == "x")متوقف کردن()؛t. join () ؛t.~thread(); websocketSession.reset();>>> retu EXIT_SUCCESS;> 

متن با موفقیت به روز شد ، اما این خطاها با آن روبرو شدند:

نویسنده Damanj در 2 فوریه 2021 نظر داد

بله ، این کد کار می کند. من از VS2019 استفاده می کنم. هیچ چیز خاصی به من مربوط نمی شود - اما من در این کتابخانه تازه کار هستم ، بنابراین شاید به نظر می رسد برای کسی که تجربه بیشتری دارد ، یک هک کار باشد؟

Like how I implemented stop, if following is called within stop the the process crashes. _ws>Close (Boost :: Beast :: WebSocket :: close_code :: عادی) ؛

بنابراین من به جای آن از Boolean استفاده می کنم که در حلقه خواندن بررسی می شود ، بنابراین می توان آن را در همان موضوع پردازش کرد - همانطور که در شماره دیگر خواندم که کتابخانه در هنگام استفاده از روش های ASYNC ، موضوعی نیست.

همکار madmongo1 نظر در 2 فوریه 2021

بله ، مستندات Beast و ASIO (که بر روی آن ساخته شده است) در مورد عدم امنیت اشیاء IO صریح است. اگر بیش از یک موضوع دارید ، باید توابع را شروع کنید () یا ارسال کنید () را بر روی رشته صحیح قرار دهید. شما همچنین باید مراقب باشید که دو نوشتن را همزمان شروع نکنید (از یک صف استفاده کنید).

من مثال دیگری دارم که ممکن است آموزنده پیدا کنید (یک لحظه)

همکار madmongo1 نظر در 2 فوریه 2021

این دارای هر دو نمونه C ++ 20 Coroutine و C ++ 11 است

نویسنده Damanj در 2 فوریه 2021 نظر داد

با خواندن مقدمه در لینک خود ، حدس می زنم که با این مثال از بیشتر پیچیدگی های ASIO جلوگیری کرده ام. من واقعاً وقت ندارم که یک متخصص ASIO شوم ، بنابراین شاید برای امنیت کد تولید ما برای من بهتر باشد تا از روش های ASYNC دور بمانم!: D تا زمانی که هیچ چیز به طرز چشمگیری با رویکرد من وجود ندارد.

همکار madmongo1 نظر در 2 فوریه 2021 نویسنده Damanj در 2 فوریه 2021 نظر داد

یادگیری ASIO دشوار است زیرا مستندات آن انتظار سطح خاصی از دانش در علوم کامپیوتر ، پیام های ناهمزمان و شبکه اساسی IO را دارد. مدتی است که از ASIO در پروژه های تولید استفاده کرده ام. اولین تلاشهای من اشتباه بود ، زیرا من در مورد معانی زمینه اجرای ، رشته ضمنی ، کنترل کننده تکمیل و توکن تکمیل نمی فهمیدم (و زحمت خواندن صحیح را ندارم). من فقط می خواستم شیرجه بزنم و اتفاقاتی را انجام دهم.

این همان چیزی است که من به آن اشاره کردم. در این کد من از رشته ضمنی ، کنترل کننده تکمیل و توکن تکمیل استفاده نمی کنم. تا آنجا که به عنوان پیام رسانی ناهمزمان و شبکه IO ، من درک دارم.

عضو Vinniefalco در 2 فوریه 2021 نظر داد نویسنده Damanj در 2 فوریه 2021 نظر داد

سلام vinniefalco بله این همان است که من برخی از کد ها را بر اساس آن بنا کردم

نویسنده Damanj در 4 فوریه 2021 نظر داد

مثال گسترده با JSON PARSER (Simdjson مورد نیاز) ، کلاس/رابط اصلی تماس های برگشتی و یک کلاس Exchange Simple که می تواند چندین وب سایت را برای اشتراک همزمان قیمت اداره کند. مشترک شدن با قیمت بیت کوین و اتریوم.

// // کپی رایت (ج) 2016-2019 Vinnie Falco (Vinnie Dot Falco در Gmail dot com) // // تحت مجوز نرم افزار Boost ، نسخه 1. 0 توزیع شده است.(به همراهی // file inserve_1_0. txt مراجعه کنید یا در http://www. boost. org/license_1_0. txt) کپی کنید // // مخزن رسمی: https://github. com/boostorg/beast // #include "./root_certificates. hpp "#include #include #include #include #include #include #include" simdjson/simdjson. h "#include #include #include #include namespace beast = boost ::::::: ؛// از فضای نام http = beast :: http ؛// از Namespace WebSocket = Beast :: WebSocket ؛// از namespace net = تقویت :: asio ؛// از namespace ssl = تقویت :: asio :: ssl ؛// از استفاده از TCP = BOOST :: ASIO :: IP :: TCP ؛// از کلاس WebSocketSessionCallbacks؛// کلاس برای اتصال به یک نقطه پایانی WebSocket و دریافت داده ها به طور مداوم CONTARTY بسته می شود یا به صورت دستی کلاس WebSocketsession را متوقف می کند: عمومی STD :: Enable_shared_from_this>_ws ؛Beast :: flat_buffer _buffer ؛std :: string _host ؛std :: string _hostandport ؛char const * _port ؛std :: string _target ؛std :: string _text ؛TCP :: نقطه پایانی _tcpendpoint ؛bool _terminate = false ؛Simdjson :: dom :: parser _jsonparser ؛WebSocketSessionCallbacks & _callbacks ؛std :: موضوع _WorkerThread ؛std :: string _sessionidenfitier ؛Void ConnectAndReceive ()next_layer (). native_handle () ، _host. c_str ()) // Update the _host string. This will provide the value of the // Host HTTP header during the WebSocket handshake. // See https://tools.ietf.org/html/rfc7230#section-5.4 _hostAndPort = _host + ':' + std::to_string(_tcpEndPoint.port()); // Perform the SSL handshake _ws>next_layer().handshake(ssl::stream_base::client); // Set a decorator to change the User-Agent of the handshake _ws>set_option (websocket :: stream_base :: دکوراتور ([] (websocket :: request_type و req))); // Perform the websocket handshake _ws>دست دستی (_hostandport ، _target) ؛// پیام های خواندن را امتحان کنیدread(_buffer); if (_buffer.size()>0)_buffer.clear();>دیگرclose(boost::beast::websocket::close_code::normal); terminating = true; //we could break out of while here, but then we would not read any final message from cpty after we send close?>>>Catch (Beast :: System_Error Const & SE)گرفتن (std :: استثنا و سابق)عمومی: // حل کننده و سوکت نیاز به IO_Context صریح WebSocketsession (WebSocketSessionCallbacks & Callbacks ، Std :: String & SessionIdenFitier ، Net :: io_context & Ioc ، SSL :: Context & Ctx ، Charst* Host ، Charst* Const* Port* Target Target<>Void Stop ()<_terminate = true; _workerThread.join(); _workerThread.~thread();>// اتصال به WebSocket در یک موضوع جدید و شروع به دریافت داده Void Start ()<_workerThread = std::thread( [this] >(_iocontext ، _sslContext) ؛تلاش كردن// خطاهای دستی شبکه یا SSL را در Attemting برای ایجاد WebSocket Catch (Beast :: System_Error Const & SE) جلب می کند.<_callbacks.WebSocketConnectionDown(_sessionIdenfitier); //notify failed connection std::cout _ws.reset();> //if we get to here Stop has been Called std::cout );>>؛// ------------------------------------------------------------------------------------------ کلاس BinanceExchange: WebSocketSessionCallbacks عمومی _cryptoCurrencySubscriptions; //implement useful application logic with the websocket callbacks >// از خرابی اتصال مطلع می کند - قطع اتصال سوکت ، مشکل انتقال پیام ، سوکت بسته و غیره void void void webSocketConnectionDown (const std :: string & sessionName) Override؛void مشترکینپتوکورنسی (std :: نماد رشته)Start(); //subscribes to market data on a new thread>دیگرvoid unsubscribcryptocurrency (std :: نماد رشته)Stop(); _cryptoCurrencySubscriptions.erase(symbol);>دیگر>؛int main (int argc ، char ** argv)؛ctx. set_verify_mode (ssl :: verify_none) ؛// این گواهی ریشه مورد استفاده برای تأیید LOAD_ROOT_CERTIFICATES (CTX) است.// سرویس I/O را اجرا کنید. هنگامی که // سوکت بسته است ، تماس برمی گردد. ioc. run () ؛BinanceExchange BinanceExchange (IOC ، CTX) ؛std :: string inputStr ؛std :: موضوع t ؛در حالی که (inputStr! = "x")inputStr ؛if (inputStr == "r")دیگری اگر (inputStr == "s" || inputStr == "x")> retu EXIT_SUCCESS;> 
دوره ی فارکس...
ما را در سایت دوره ی فارکس دنبال می کنید

برچسب : نویسنده : مهناز افشار بازدید : 51 تاريخ : شنبه 21 مرداد 1402 ساعت: 17:56