Created
September 29, 2022 19:18
-
-
Save ecatmur/bc9c837cef44c2aca7f74067f6ec20db to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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