Aedis 1.4.1
A redis client library
echo_server.cpp
1/* Copyright (c) 2018-2022 Marcelo Zimbres Silva (mzimbres@gmail.com)
2 *
3 * Distributed under the Boost Software License, Version 1.0. (See
4 * accompanying file LICENSE.txt)
5 */
6
7#include <boost/asio.hpp>
8#if defined(BOOST_ASIO_HAS_CO_AWAIT)
9#include <boost/asio/experimental/awaitable_operators.hpp>
10#include <aedis.hpp>
11#include "common/common.hpp"
12
13namespace net = boost::asio;
14namespace resp3 = aedis::resp3;
15using namespace net::experimental::awaitable_operators;
16using tcp_socket = net::use_awaitable_t<>::as_default_on_t<net::ip::tcp::socket>;
17using tcp_acceptor = net::use_awaitable_t<>::as_default_on_t<net::ip::tcp::acceptor>;
18using signal_set = net::use_awaitable_t<>::as_default_on_t<net::signal_set>;
19using aedis::adapt;
20
21auto echo_server_session(tcp_socket socket, std::shared_ptr<connection> conn) -> net::awaitable<void>
22{
24 std::string resp;
25
26 for (std::string buffer;;) {
27 auto n = co_await net::async_read_until(socket, net::dynamic_buffer(buffer, 1024), "\n");
28 req.push("PING", buffer);
29 auto tmp = std::tie(resp);
30 co_await conn->async_exec(req, adapt(tmp));
31 co_await net::async_write(socket, net::buffer(resp));
32 resp.clear();
33 req.clear();
34 buffer.erase(0, n);
35 }
36}
37
38// Listens for tcp connections.
39auto listener(std::shared_ptr<connection> conn) -> net::awaitable<void>
40{
41 auto ex = co_await net::this_coro::executor;
42 tcp_acceptor acc(ex, {net::ip::tcp::v4(), 55555});
43 for (;;)
44 net::co_spawn(ex, echo_server_session(co_await acc.async_accept(), conn), net::detached);
45}
46
47// Called from the main function (see main.cpp)
48auto async_main() -> net::awaitable<void>
49{
50 auto ex = co_await net::this_coro::executor;
51 auto conn = std::make_shared<connection>(ex);
52 signal_set sig{ex, SIGINT, SIGTERM};
53
55 req.push("HELLO", 3);
56
57 co_await connect(conn, "127.0.0.1", "6379");
58 co_await ((conn->async_run() || listener(conn) || healthy_checker(conn) ||
59 sig.async_wait()) && conn->async_exec(req));
60}
61
62#endif // defined(BOOST_ASIO_HAS_CO_AWAIT)
Creates Redis requests.
Definition: request.hpp:168
void push(std::string_view cmd, Ts const &... args)
Appends a new command to the end of the request.
Definition: request.hpp:260
void clear()
Clears the request preserving allocated memory.
Definition: request.hpp:228
auto adapt(std::size_t max_read_size=(std::numeric_limits< std::size_t >::max)()) noexcept
Creates an adapter that ignores responses.
Definition: adapt.hpp:199
auto async_write(AsyncWriteStream &stream, Request const &req, CompletionToken &&token=boost::asio::default_completion_token_t< typename AsyncWriteStream::executor_type >{})
Writes a request asynchronously.
Definition: write.hpp:53