Bibliothèques WebSocket C++ : aperçu et exemples d'utilisation

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Bibliothèques WebSocket pour C++ : guide complet



WebSocket est un protocole assurant une communication bidirectionnelle entre un client et un serveur sur une seule connexion TCP. Contrairement à HTTP, WebSocket permet au serveur d'envoyer des données au client sans requête préalable, ce qui le rend idéal pour les chats, les jeux, les cotations boursières et autres applications en temps réel. Dans l'écosystème C++, il existe plusieurs bibliothèques matures implémentant ce protocole. Dans cet article, nous examinons les trois plus populaires : Boost.Beast, uWebSockets et libwebsockets.



1. Boost.Beast (recommandé)



Boost.Beast est une bibliothèque basée sur Boost.Asio, fournissant les protocoles HTTP et WebSocket. Elle fait partie de la distribution officielle de Boost (depuis la version 1.66). Principaux avantages : typage strict, prise en charge complète de la norme RFC 6455, intégration avec Asio pour le travail asynchrone.



Fonctionnalités principales :

  • Clients/serveurs WebSocket synchrones et asynchrones
  • Prise en charge des trames, des pings/pongs, de la fermeture de connexion
  • Fonctionnement sur TLS (via Boost.Asio SSL)
  • Multiplateforme (Linux, Windows, macOS)


Exemple de serveur WebSocket (asynchrone) :

#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 << "Reçu : " << msg << std::endl;

// Réponse écho ws.text(ws.got_text()); ws.write(buffer.data()); } } catch(beast::system_error const& se) { if(se.code() != websocket::error::closed) { std::cerr << "Erreur : " << 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 << "Erreur : " << e.what() << std::endl; return EXIT_FAILURE; } return EXIT_SUCCESS;}


2. uWebSockets (uWS)



uWebSockets est une bibliothèque haute performance, axée sur une vitesse maximale et une consommation mémoire minimale. Elle est écrite en C++17 et utilise sa propre boucle d'événements (pas Boost.Asio). Idéale pour les microservices et les applications avec des milliers de connexions simultanées.



Caractéristiques clés :

  • Très faible latence (~2-3 microsecondes par message)
  • Prise en charge de WebSocket, HTTP et SSE (Server-Sent Events)
  • Prise en charge intégrée de TLS (via OpenSSL ou BoringSSL)
  • Aucune dépendance externe (sauf OpenSSL pour TLS)


Exemple de serveur WebSocket simple :

#include "App.h"

int main() { uWS::App().ws<int>("/*", { .open = [](auto* ws) { std::cout << "Client connecté" << std::endl; ws->send("Bienvenue !", uWS::OpCode::TEXT); }, .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) { std::cout << "Reçu : " <<

Recommendations