Bibliotecas WebSocket para C++: guía completa
WebSocket es un protocolo que proporciona comunicación full-duplex entre un cliente y un servidor a través de una única conexión TCP. A diferencia de HTTP, WebSocket permite al servidor enviar datos al cliente sin una solicitud previa, lo que lo hace ideal para chats, juegos, cotizaciones bursátiles y otras aplicaciones en tiempo real. En el ecosistema de C++, existen varias bibliotecas maduras que implementan este protocolo. En este artículo, analizaremos las tres más populares: Boost.Beast, uWebSockets y libwebsockets.
1. Boost.Beast (recomendado)
Boost.Beast es una biblioteca basada en Boost.Asio que proporciona los protocolos HTTP y WebSocket. Forma parte de la distribución oficial de Boost (a partir de la versión 1.66). Sus principales ventajas son: tipado estricto, soporte completo del estándar RFC 6455 e integración con Asio para trabajo asíncrono.
Características principales:
- Clientes/servidores WebSocket síncronos y asíncronos
- Soporte para frames, pings/pongs y cierre de conexión
- Funcionamiento sobre TLS (a través de Boost.Asio SSL)
- Multiplataforma (Linux, Windows, macOS)
Ejemplo de servidor WebSocket (asíncrono):
#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;
// Eco-respuesta 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 es una biblioteca de alto rendimiento, orientada a la máxima velocidad y el mínimo consumo de memoria. Está escrita en C++17 y utiliza su propio event loop (no Boost.Asio). Es ideal para microservicios y aplicaciones con miles de conexiones simultáneas.
Características clave:
- Latencia muy baja (~2-3 microsegundos por mensaje)
- Soporte para WebSocket, HTTP y SSE (Server-Sent Events)
- Soporte integrado para TLS (a través de OpenSSL o BoringSSL)
- No requiere dependencias externas (excepto OpenSSL para TLS)
Ejemplo de un servidor WebSocket simple:
#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: " <<```