WebSocket en C++: bibliotecas y aplicación práctica

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

Biblioteca WebSocket C++: revisión completa y ejemplos de uso



WebSocket es un protocolo de comunicación full-duplex sobre TCP que proporciona una conexión persistente entre el cliente y el servidor. A diferencia de HTTP, WebSocket permite enviar mensajes en ambas direcciones sin solicitudes repetitivas constantes, lo que es ideal para chats, juegos en línea, cotizaciones bursátiles y otras aplicaciones en tiempo real.



En C++ existen varias bibliotecas maduras para trabajar con WebSocket. En este artículo, analizaremos las tres opciones más populares: Boost.Beast, uWebSockets y libwebsockets. Revisaremos sus características, instalación y proporcionaremos ejemplos de código funcionales.



1. Boost.Beast — potente y estandarizado



Boost.Beast es una biblioteca basada en Boost.Asio que implementa los protocolos HTTP y WebSocket. Forma parte de Boost (desde la versión 1.66) y es el estándar de facto para proyectos serios en C++.



Instalación

# Instalación de Boost (Ubuntu/Debian)sudo apt install libboost-all-dev

# O compilación desde el código fuente con la opción --with-beast


Ejemplo de servidor WebSocket (servidor eco)

#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/ip/tcp.hpp>#include <iostream>#include <string>

namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;

int main() { try { net::io_context ioc; tcp::acceptor acceptor(ioc, tcp::endpoint(tcp::v4(), 8080));

while (true) { tcp::socket socket{ioc}; acceptor.accept(socket);

websocket::stream<tcp::socket> ws{std::move(socket)}; ws.accept();

for (;;) { beast::flat_buffer buffer; ws.read(buffer); std::string msg = beast::buffers_to_string(buffer.data()); std::cout << "Recibido: " << msg << std::endl;

ws.text(ws.got_text()); ws.write(buffer.data()); } } } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}


Ejemplo de cliente WebSocket

#include <boost/beast/core.hpp>#include <boost/beast/websocket.hpp>#include <boost/asio/connect.hpp>#include <iostream>

namespace beast = boost::beast;namespace websocket = beast::websocket;namespace net = boost::asio;using tcp = net::ip::tcp;

int main() { try { net::io_context ioc; tcp::resolver resolver{ioc}; websocket::stream<tcp::socket> ws{ioc};

auto const results = resolver.resolve("localhost", "8080"); net::connect(ws.next_layer(), results.begin(), results.end()); ws.handshake("localhost", "/");

ws.write(net::buffer(std::string("¡Hola, servidor!"))); beast::flat_buffer buffer; ws.read(buffer); std::cout << "Respuesta: " << beast::buffers_to_string(buffer.data()) << std::endl;

ws.close(websocket::close_code::normal); } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; } return 0;}


2. uWebSockets — rápido y ligero



uWebSockets (µWebSockets) es una biblioteca de alto rendimiento escrita en C++11. Utiliza su propio bucle de eventos y soporta tanto HTTP como WebSocket. Se caracteriza por un consumo mínimo de memoria y una alta velocidad de operación.



Instalación

git clone https://github.com/uNetworking/uWebSockets.gitcd uWebSocketsmakesudo make install


Ejemplo de servidor eco

#include <uwebsoc                    

Recommendations