Skip to content

Instantly share code, notes, and snippets.

@ecatmur
Created September 29, 2022 19:18
Show Gist options
  • Save ecatmur/bc9c837cef44c2aca7f74067f6ec20db to your computer and use it in GitHub Desktop.
Save ecatmur/bc9c837cef44c2aca7f74067f6ec20db to your computer and use it in GitHub Desktop.
#include <boost/asio.hpp>
#include <boost/asio/experimental/promise.hpp>
#include <boost/beast/core/tcp_stream.hpp>
#include <boost/beast/websocket/stream.hpp>
boost::asio::awaitable<void> echo(boost::beast::websocket::stream<boost::beast::tcp_stream>& stream) {
for (;;) {
boost::beast::flat_buffer buf;
co_await stream.async_read(buf, boost::asio::use_awaitable);
co_await stream.async_write(buf.data(), boost::asio::use_awaitable);
}
}
boost::asio::awaitable<void> cancel(boost::asio::signal_set& signals, boost::asio::ip::tcp::socket& sock) {
co_await signals.async_wait(boost::asio::use_awaitable);
sock.close();
}
boost::asio::awaitable<void> serve(boost::asio::ip::tcp::socket sock, boost::asio::signal_set& signals) {
boost::beast::websocket::stream<boost::beast::tcp_stream> stream(std::move(sock));
co_await stream.async_accept(boost::asio::use_awaitable);
auto ex = co_await boost::asio::this_coro::executor;
auto promise = co_spawn(ex, echo(stream), boost::asio::experimental::use_promise);
co_await co_spawn(ex, cancel(signals, boost::beast::get_lowest_layer(stream).socket()), boost::asio::use_awaitable);
}
boost::asio::awaitable<void> accept(boost::asio::ip::tcp::acceptor& acceptor, boost::asio::signal_set& signals) {
for (;;)
co_spawn(
co_await boost::asio::this_coro::executor,
serve(co_await acceptor.async_accept(boost::asio::use_awaitable), signals),
boost::asio::detached);
}
int main() {
boost::asio::io_context ctx;
boost::asio::signal_set signals(ctx, SIGHUP);
boost::asio::ip::tcp::acceptor acceptor(ctx, {boost::asio::ip::tcp::v4(), 54321});
co_spawn(ctx, accept(acceptor, signals), boost::asio::detached);
ctx.run();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment