WebSocket in C++: Echtzeit-Anwendungen auf fortgeschrittenem Niveau

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum WebSocket in C++ die Wahl von Profis für Echtzeitsysteme ist

\n

In der modernen Welt der Echtzeitkommunikation – von Börsenterminals bis hin zu Mehrspieler-Spielen – entscheiden Millisekunden Verzögerung über alles. WebSocket in C++ ermöglicht eine Leistung, die interpretierten Sprachen unerreicht bleibt. In diesem Artikel analysieren wir fortgeschrittene Techniken zur Erstellung von Echtzeit-Anwendungen in C++ unter Verwendung der Bibliothek Boost.Beast, die eine niedrigschwellige Kontrolle über das Protokoll und minimale Overhead-Kosten bietet.

\n

Wir werden nicht die Grundlagen behandeln – es wird vorausgesetzt, dass Sie mit der Netzwerkprogrammierung in C++ und den Grundlagen von WebSocket vertraut sind. Stattdessen konzentrieren wir uns auf Architektur, Skalierung, Fehlerbehandlung und Leistungsoptimierung.

\n\n

Architektur eines asynchronen WebSocket-Servers in C++ mit Boost.Beast

\n

Der entscheidende Vorteil von C++ ist die Möglichkeit, vollständig asynchrone Systeme ohne Thread-Overhead zu erstellen. Boost.Beast baut auf Boost.Asio auf und bietet so ein leistungsstarkes Toolkit für die Arbeit mit Netzwerk-Sockets.

\n\n

Grundlegende Serverstruktur

\n

Der Server muss Tausende gleichzeitiger Verbindungen verarbeiten können. Dazu werden eine Event-Loop (io_context) und asynchrone Operationen verwendet. Betrachten wir eine minimale, aber fortgeschrittene Implementierung:

\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        // Asynchroner Handshake\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        // Nachrichtenverarbeitung\n        std::string msg = beast::buffers_to_string(buffer_.data());\n        buffer_.consume(buffer_.size());\n\n        // Echo-Antwort (in einer echten Anwendung: Geschäftslogik)\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

Sitzungsverwaltung und Broadcast

\n

Für einen Echtzeit-Chat oder eine Überwachung müssen Nachrichten an alle verbundenen Clients gesendet werden. Wir verwenden einen thread-sicheren Container:

\n\n
class 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                

Blogs

Buchempfehlungen