WebSocket-Bibliotheken für C++: Vollständige Anleitung
WebSocket ist ein Protokoll, das eine Vollduplex-Kommunikation zwischen Client und Server über eine einzige TCP-Verbindung ermöglicht. Im Gegensatz zu HTTP erlaubt WebSocket dem Server, Daten ohne vorherige Anfrage an den Client zu senden, was es ideal für Chats, Spiele, Börsenkurse und andere Echtzeitanwendungen macht. Im C++-Ökosystem gibt es mehrere ausgereifte Bibliotheken, die dieses Protokoll implementieren. In diesem Artikel betrachten wir die drei beliebtesten: Boost.Beast, uWebSockets und libwebsockets.
1. Boost.Beast (empfohlen)
Boost.Beast ist eine Bibliothek, die auf Boost.Asio basiert und HTTP- und WebSocket-Protokolle bereitstellt. Sie ist Teil der offiziellen Boost-Distribution (ab Version 1.66). Hauptvorteile: starke Typisierung, vollständige Unterstützung des RFC-6455-Standards, Integration mit Asio für asynchrone Arbeit.
Hauptfunktionen:
- Synchrone und asynchrone WebSocket-Clients/Server
- Unterstützung für Frames, Pings/Pongs, Verbindungsschließung
- Arbeit über TLS (über Boost.Asio SSL)
- Plattformunabhängigkeit (Linux, Windows, macOS)
Beispiel eines WebSocket-Servers (asynchron):
#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;
// Echo-Antwort 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 ist eine leistungsstarke Bibliothek, die auf maximale Geschwindigkeit und minimalen Speicherverbrauch ausgelegt ist. Sie ist in C++17 geschrieben und verwendet eine eigene Ereignisschleife (nicht Boost.Asio). Sie eignet sich hervorragend für Mikrodienste und Anwendungen mit Tausenden gleichzeitigen Verbindungen.
Wesentliche Merkmale:
- Sehr geringe Latenz (~2-3 Mikrosekunden pro Nachricht)
- Unterstützung für WebSocket, HTTP und SSE (Server-Sent Events)
- Integrierte TLS-Unterstützung (über OpenSSL oder BoringSSL)
- Keine externen Abhängigkeiten erforderlich (außer OpenSSL für TLS)
Beispiel eines einfachen WebSocket-Servers:
#include "App.h"
int main() { uWS::App().ws<int>("/*", { .open = [](auto* ws) { std::cout << "Client verbunden" << std::endl; ws->send("Willkommen!", uWS::OpCode::TEXT); }, .message = [](auto* ws, std::string_view message, uWS::OpCode opCode) { std::cout << "Empfangen: " <<