مقدمة: لماذا WebSocket على C++ هو اختيار المحترفين لأنظمة الوقت الفعلي
\nفي عالم اتصالات الوقت الفعلي الحديث - من محطات التداول إلى الألعاب متعددة اللاعبين - زمن الاستجابة بالميلي ثانية يحسم كل شيء. يتيح WebSocket على C++ تحقيق أداء لا يمكن للغات المفسرة الوصول إليه. في هذه المقالة، سنحلل التقنيات المتقدمة لإنشاء تطبيقات الوقت الفعلي على C++ باستخدام مكتبة Boost.Beast، التي توفر تحكمًا منخفض المستوى في البروتوكول وأقل تكاليف إضافية.
\nلن نناقش الأساسيات - من المفترض أنك على دراية ببرمجة الشبكات على C++ وأساسيات WebSocket. بدلاً من ذلك، سنركز على البنية المعمارية، توسيع النطاق، معالجة الأخطاء، وتحسين الأداء.
\n\nبنية خادم WebSocket غير المتزامن على C++ مع Boost.Beast
\nالميزة الرئيسية لـ C++ هي إمكانية بناء أنظمة غير متزامنة بالكامل دون تكاليف إضافية للخيوط. تم بناء Boost.Beast فوق Boost.Asio، مما يوفر مجموعة أدوات قوية للعمل مع مآخذ الشبكة.
\n\nالهيكل الأساسي للخادم
\nيجب أن يكون الخادم قادرًا على معالجة آلاف الاتصالات المتزامنة. لهذا، يتم استخدام حلقة الأحداث (io_context) والعمليات غير المتزامنة. لننظر في تنفيذ بسيط ولكنه متقدم:
\n\n#include <boost/beast/core.hpp>\n#include <boost/beast/websocket.hpp>\n#include <boost/asio.hpp>\n#include <memory>\n#include <string>\n#include <unordered_set>\n\nnamespace beast = boost::beast;\nnamespace websocket = beast::websocket;\nnamespace net = boost::asio;\nusing tcp = net::ip::tcp;\n\nclass WebSocketSession : public std::enable_shared_from_this<WebSocketSession> {\n websocket::stream<beast::tcp_stream> ws_;\n beast::flat_buffer buffer_;\n\npublic:\n explicit WebSocketSession(tcp::socket&& socket)\n : ws_(std::move(socket)) {}\n\n void run() {\n // المصافحة غير المتزامنة\n ws_.async_accept(\n beast::bind_front_handler(\n &WebSocketSession::on_accept,\n shared_from_this()));\n }\n\nprivate:\n void on_accept(beast::error_code ec) {\n if (ec) return;\n do_read();\n }\n\n void do_read() {\n ws_.async_read(buffer_,\n beast::bind_front_handler(\n &WebSocketSession::on_read,\n shared_from_this()));\n }\n\n void on_read(beast::error_code ec, std::size_t bytes_transferred) {\n if (ec == websocket::error::closed) return;\n if (ec) return;\n\n // معالجة الرسالة\n std::string msg = beast::buffers_to_string(buffer_.data());\n buffer_.consume(buffer_.size());\n\n // استجابة الصدى (في التطبيق الحقيقي - منطق الأعمال)\n ws_.text(ws_.got_text());\n ws_.async_write(net::buffer(msg),\n beast::bind_front_handler(\n &WebSocketSession::on_write,\n shared_from_this()));\n }\n\n void on_write(beast::error_code ec, std::size_t bytes_transferred) {\n if (ec) return;\n do_read();\n }\n};\n\nإدارة الجلسات والبث الجماعي
\nلدردشة الوقت الفعلي أو المراقبة، يلزم إرسال الرسائل إلى جميع العملاء المتصلين. نستخدم حاوية آمنة للخيوط:
\n\nclass WebSocketServer {\n net::io_context& ioc_;\n tcp::acceptor acceptor_;\n std::unordered_set<std::shared_ptr<WebSocketSession>> sessions_;\n std::mutex sessions_mutex_;\n\npublic:\n WebSocketServer(net::io_context& ioc, short port)\n : ioc_(ioc)\n , acceptor_(ioc, tcp::endpoint(tcp::v4(), port)) {\n do_accept();\n }\n\n void broadcast(const std::string& message) {\n std::lock_guard<std::mutex> lock(sessions_mutex_);\n for (auto& session : sessions_) {\n session->send(message);\n }\n