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-beastEjemplo 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 installEjemplo de servidor eco
#include <uwebsoc También en la biblioteca
gRPC para Go (Golang): bibliotecas, ejemplos y guía práctica
Trabajo con archivos ZIP en Rust: biblioteca zip y guía completa
Cliente Elasticsearch para TypeScript: @elastic/elasticsearch
Criptografía en Swift (iOS/macOS): cifrado y hash