I’d like to draw attention to an open-source library that I open sourced a while ago: Seasocks.
Seasocks is a simple-to-use, lightweight, embeddable C++ library that implements HTTP and websockets. It has a simple way of serving static content and even some dynamic content, but its main raison d’ĂȘtre is for websocket-based command and control.
It has no external library dependencies, and only requires C++11 features such as GCC 4.7 and above and Clang 3.4 already support.
Serving static files is as simple as:
void serve() {
Server server(make_shared<PrintfLogger>();
server.serve("web", 9090);
}
Websockets are a little more involved, but not a whole deal more. He’s the skeleton of a chat client that simply broadcasts any input from a client to all other connected parties.
struct ChatHandler : WebSocket::Handler {
set<WebSocket *> connections;
void onConnect(WebSocket *socket) override
{ connections.insert(socket); }
void onData(WebSocket *, const char *data) override
{ for (auto c : connections) c->send(data); }
void onDisconnect(WebSocket *socket) override
{ connections.erase(socket); }
};
void chat() {
Server server(make_shared<PrintfLogger>());
server.addWebSocketHandler(
"/chat", make_shared<ChatHandler>());
server.serve("web", 9090);
}
There are more examples in the source.
There are other websocket libraries for C++ out there, but Seasocks has been the workhorse of our C++ command and control for over four years now and has proven to be a pretty reliable bit of software.
Matt Godbolt is a C++ developer living in Chicago. Follow him on Mastodon or Bluesky.