Biblioteca WebSocket C++: revisão completa e exemplos de uso
WebSocket é um protocolo de comunicação full-duplex sobre TCP que estabelece uma conexão permanente entre cliente e servidor. Ao contrário do HTTP, o WebSocket permite enviar mensagens em ambas as direções sem requisições repetidas constantes, sendo ideal para chats, jogos online, cotações de bolsa e outras aplicações em tempo real.
Em C++, existem várias bibliotecas maduras para trabalhar com WebSocket. Neste artigo, analisaremos três das opções mais populares: Boost.Beast, uWebSockets e libwebsockets. Abordaremos suas características, instalação e forneceremos exemplos de código funcionais.
1. Boost.Beast — poderoso e padronizado
Boost.Beast é uma biblioteca baseada no Boost.Asio que implementa os protocolos HTTP e WebSocket. Ela faz parte do Boost (desde a versão 1.66) e é o padrão de facto para projetos sérios em C++.
Instalação
# Instalação do Boost (Ubuntu/Debian)sudo apt install libboost-all-dev
# Ou compilação a partir do código-fonte com a opção --with-beastExemplo 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 << "Recebido: " << msg << std::endl;
ws.text(ws.got_text()); ws.write(buffer.data()); } } } catch (const std::exception& e) { std::cerr << "Erro: " << e.what() << std::endl; } return 0;}Exemplo 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("Olá, servidor!"))); beast::flat_buffer buffer; ws.read(buffer); std::cout << "Resposta: " << beast::buffers_to_string(buffer.data()) << std::endl;
ws.close(websocket::close_code::normal); } catch (const std::exception& e) { std::cerr << "Erro: " << e.what() << std::endl; } return 0;}2. uWebSockets — rápido e leve
uWebSockets (µWebSockets) é uma biblioteca de alto desempenho escrita em C++11. Ela utiliza seu próprio event loop e suporta tanto HTTP quanto WebSocket. Destaca-se pelo consumo mínimo de memória e alta velocidade de operação.
Instalação
git clone https://github.com/uNetworking/uWebSockets.gitcd uWebSocketsmakesudo make installExemplo de servidor eco
#include <uwebsoc