WebSocket libraries for C++: complete guide
WebSocket is a protocol that provides full-duplex communication between a client and a server over a single TCP connection. Unlike HTTP, WebSocket allows the server to send data to the client without a preliminary request, making it ideal for chats, games, stock quotes, and other real-time applications. In the C++ ecosystem, there are several mature libraries that implement this protocol. In this article, we will look at three of the most popular ones: Boost.Beast, uWebSockets, and libwebsockets.
1. Boost.Beast (recommended)
Boost.Beast is a library based on Boost.Asio that provides HTTP and WebSocket protocols. It is part of the official Boost distribution (starting from version 1.66). Main advantages: strong typing, full support for the RFC 6455 standard, integration with Asio for asynchronous operation.
Main features:
- Synchronous and asynchronous WebSocket clients/servers
- Support for frames, pings/pongs, connection closure
- Operation over TLS (via Boost.Asio SSL)
- Cross-platform (Linux, Windows, macOS)
WebSocket server example (asynchronous):
#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 response 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 is a high-performance library focused on maximum speed and minimal memory consumption. It is written in C++17 and uses its own event loop (not Boost.Asio). It is well suited for microservices and applications with thousands of concurrent connections.
Key features:
- Very low latency (~2-3 microseconds per message)
- Support for WebSocket, HTTP, and SSE (Server-Sent Events)
- Built-in TLS support (via OpenSSL or BoringSSL)
- No external dependencies (except OpenSSL for TLS)
Simple WebSocket server example:
#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: " <<