Aedis 0.2.1  
High level Redis client
echo_server_client.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 <iostream>
8 #include <boost/asio.hpp>
9 
10 namespace net = boost::asio;
11 
12 using net::ip::tcp;
13 using tcp_socket = net::use_awaitable_t<>::as_default_on_t<net::ip::tcp::socket>;
14 using timer_type = net::use_awaitable_t<>::as_default_on_t<net::steady_timer>;
15 
16 net::awaitable<void>
17 example(boost::asio::ip::tcp::endpoint ep, std::string msg, int n)
18 {
19  try {
20  auto ex = co_await net::this_coro::executor;
21 
22  tcp_socket socket{ex};
23  co_await socket.async_connect(ep);
24 
25  std::string buffer;
26  auto dbuffer = net::dynamic_buffer(buffer);
27  for (int i = 0; i < n; ++i) {
28  co_await net::async_write(socket, net::buffer(msg));
29  auto n = co_await net::async_read_until(socket, dbuffer, "\n");
30  //std::printf("> %s", buffer.data());
31  dbuffer.consume(n);
32  }
33 
34  //std::printf("Ok: %s", msg.data());
35  } catch (std::exception const& e) {
36  std::cerr << "Error: " << e.what() << std::endl;
37  }
38 }
39 
40 int main(int argc, char* argv[])
41 {
42  try {
43  int sessions = 1;
44  int msgs = 1;
45 
46  if (argc == 3) {
47  sessions = std::stoi(argv[1]);
48  msgs = std::stoi(argv[2]);
49  }
50 
51  net::io_context ioc;
52 
53  tcp::resolver resv{ioc};
54  auto const res = resv.resolve("127.0.0.1", "55555");
55  auto ep = *std::begin(res);
56 
57  for (int i = 0; i < sessions; ++i)
58  net::co_spawn(ioc, example(ep, "Some message\n", msgs), net::detached);
59 
60  ioc.run();
61  } catch (std::exception const& e) {
62  std::cerr << e.what() << std::endl;
63  }
64 }