مكتبة WebSocket بلغة C++: مراجعة شاملة وأمثلة استخدام
WebSocket هو بروتوكول اتصال ثنائي الاتجاه كامل يعمل عبر TCP، ويوفر اتصالاً مستمراً بين العميل والخادم. على عكس HTTP، يتيح WebSocket إرسال الرسائل في كلا الاتجاهين دون الحاجة إلى طلبات متكررة، مما يجعله مثالياً للدردشات، الألعاب عبر الإنترنت، أسعار الأسهم، والتطبيقات في الوقت الفعلي (real-time).
في لغة C++، توجد عدة مكتبات ناضجة للعمل مع WebSocket. في هذه المقالة، سنستعرض ثلاثة من الخيارات الأكثر شيوعاً: Boost.Beast، uWebSockets، وlibwebsockets. سنناقش مميزاتها، طريقة تثبيتها، ونقدم أمثلة عملية على الكود.
1. Boost.Beast — قوي وموحد
Boost.Beast هي مكتبة مبنية على Boost.Asio، وتنفذ بروتوكولي HTTP وWebSocket. وهي جزء من Boost (بدءاً من الإصدار 1.66) وتُعتبر المعيار الفعلي لمشاريع C++ الجادة.
التثبيت
# تثبيت Boost (Ubuntu/Debian)sudo apt install libboost-all-dev
# أو البناء من المصدر مع الخيار --with-beastمثال لخادم WebSocket (خادم الصدى)
#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/ip/tcp.hpp>#include <iostream>#include <string>
namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;
int main() { try { net::io_context ioc; tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8080));
while (true) { tcp::socket socket{ioc}; acceptor.accept(socket);
websocket::stream<tcp::socket> ws{std::move(socket)}; ws.accept();
for (;;) { beast::flat_buffer buffer; ws.read(buffer); std::string msg = beast::buffers_to_string(buffer.data()); std::cout << "تم الاستلام: " << msg << std::endl;
ws.text(ws.got_text()); ws.write(buffer.data()); } } } catch (const std::exception& e) { std::cerr << "خطأ: " << e.what() << std::endl; } return 0;}مثال لعميل WebSocket
#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/connect.hpp>#include <iostream>
namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;
int main() { try { net::io_context ioc; tcp::resolver resolver{ioc}; websocket::stream<tcp::socket> ws{ioc};
auto const results = resolver.resolve("localhost", "8080"); net::connect(ws.next_layer(), results.begin(), results.end()); ws.handshake("localhost", "/");
ws.write(net::buffer(std::string("مرحباً أيها الخادم!"))); beast::flat_buffer buffer; ws.read(buffer); std::cout << "الرد: " << beast::buffers_to_string(buffer.data()) << std::endl;
ws.close(websocket::close_code::normal); } catch (const std::exception& e) { std::cerr << "خطأ: " << e.what() << std::endl; } return 0;}2. uWebSockets — سريع وخفيف
uWebSockets (µWebSockets) هي مكتبة عالية الأداء مكتوبة بلغة C++11. تستخدم حلقة أحداث (event loop) خاصة بها وتدعم كلاً من HTTP وWebSocket. تتميز باستهلاك منخفض للذاكرة وسرعة عالية في الأداء.
التثبيت
git clone https://github.com/uNetworking/uWebSockets.gitcd uWebSocketsmakesudo make installمثال لخادم الصدى
#include <uwebsoc