مكتبات WebSocket للغة C++: نظرة عامة وأمثلة استخدام

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبات WebSocket للغة C++: دليل شامل



WebSocket هو بروتوكول يوفر اتصالاً ثنائي الاتجاه بين العميل والخادم عبر اتصال TCP واحد. على عكس HTTP، يسمح WebSocket للخادم بإرسال البيانات إلى العميل دون طلب مسبق، مما يجعله مثالياً للدردشات والألعاب وأسعار الأسهم وتطبيقات الوقت الفعلي الأخرى. في بيئة C++، توجد عدة مكتبات ناضجة تنفذ هذا البروتوكول. في هذه المقالة، سنستعرض ثلاثة من أشهرها: Boost.Beast و uWebSockets و libwebsockets.



1. Boost.Beast (موصى به)



Boost.Beast هي مكتبة مبنية على Boost.Asio، توفر بروتوكولي HTTP و WebSocket. وهي جزء من التوزيعة الرسمية لـ Boost (بدءاً من الإصدار 1.66). المزايا الرئيسية: الكتابة الصارمة للأنواع، الدعم الكامل لمعيار RFC 6455، التكامل مع Asio للعمل غير المتزامن.



الإمكانيات الرئيسية:

  • عملاء/خوادم WebSocket متزامنة وغير متزامنة
  • دعم الإطارات، ping/pong، إغلاق الاتصال
  • العمل عبر TLS (عبر Boost.Asio SSL)
  • التوافق عبر المنصات (Linux، Windows، macOS)


مثال لخادم WebSocket (غير متزامن):

#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/ip/tcp.hpp>#include <cstdlib>#include <functional>#include <iostream>#include <string>

namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;

void do_session(tcp::socket& socket) { try { websocket::stream<tcp::socket> ws{std::move(socket)}; ws.accept();

for(;;) { beast::flat_buffer buffer; ws.read(buffer); auto msg = beast::buffers_to_string(buffer.data()); std::cout << "Received: " << msg << std::endl;

// استجابة الصدى ws.text(ws.got_text()); ws.write(buffer.data()); } } catch(beast::system_error const& se) { if(se.code() != websocket::error::closed) { std::cerr << "Error: " << se.code().message() << std::endl; } }}

int main() { try { net::io_context ioc{1}; tcp::acceptor acceptor{ioc, {tcp::v4(), 8080}};

for(;;) { tcp::socket socket{ioc}; acceptor.accept(socket); std::thread{std::bind(&do_session, std::move(socket))}.detach(); } } catch(std::exception const& e) { std::cerr << "Error: " << e.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS;}


2. uWebSockets (uWS)



uWebSockets هي مكتبة عالية الأداء، تركز على أقصى سرعة وأقل استهلاك للذاكرة. مكتوبة بلغة C++17 وتستخدم حلقة أحداث خاصة بها (ليست Boost.Asio). مناسبة تماماً للخدمات المصغرة والتطبيقات التي تحتوي على آلاف الاتصالات المتزامنة.



الميزات الرئيسية:

  • زمن استجابة منخفض جداً (~2-3 ميكروثانية لكل رسالة)
  • دعم WebSocket و HTTP و SSE (أحداث يرسلها الخادم)
  • دعم مدمج لـ TLS (عبر OpenSSL أو BoringSSL)
  • لا يتطلب تبعيات خارجية (باستثناء OpenSSL لـ TLS)


مثال لخادم WebSocket بسيط:

#include "App.h"

int main() { uWS::App().ws<int>("/*", { .open = [](auto* ws) { std::cout << "Client connected" << std::endl; ws->send("Welcome!", uWS::OpCode::TEXT); }, .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) { std::cout << "Received: " <<

توصيات