Bibliotecas WebSocket para C++: descripción general y ejemplos de uso

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course
```html

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: " <<```

Recommendations