echo_server_with_default.cpp 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. //
  2. // echo_server_with_default.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2019 Christopher M. Kohlhoff (chris at kohlhoff dot com)
  6. //
  7. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  8. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  9. //
  10. #include <boost/asio/co_spawn.hpp>
  11. #include <boost/asio/detached.hpp>
  12. #include <boost/asio/io_context.hpp>
  13. #include <boost/asio/ip/tcp.hpp>
  14. #include <boost/asio/signal_set.hpp>
  15. #include <boost/asio/write.hpp>
  16. #include <cstdio>
  17. using boost::asio::ip::tcp;
  18. using boost::asio::awaitable;
  19. using boost::asio::co_spawn;
  20. using boost::asio::detached;
  21. using boost::asio::use_awaitable_t;
  22. using tcp_acceptor = use_awaitable_t<>::as_default_on_t<tcp::acceptor>;
  23. using tcp_socket = use_awaitable_t<>::as_default_on_t<tcp::socket>;
  24. namespace this_coro = boost::asio::this_coro;
  25. awaitable<void> echo(tcp_socket socket)
  26. {
  27. try
  28. {
  29. char data[1024];
  30. for (;;)
  31. {
  32. std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data));
  33. co_await async_write(socket, boost::asio::buffer(data, n));
  34. }
  35. }
  36. catch (std::exception& e)
  37. {
  38. std::printf("echo Exception: %s\n", e.what());
  39. }
  40. }
  41. awaitable<void> listener()
  42. {
  43. auto executor = co_await this_coro::executor;
  44. tcp_acceptor acceptor(executor, {tcp::v4(), 55555});
  45. for (;;)
  46. {
  47. auto socket = co_await acceptor.async_accept();
  48. co_spawn(executor,
  49. [socket = std::move(socket)]() mutable
  50. {
  51. return echo(std::move(socket));
  52. },
  53. detached);
  54. }
  55. }
  56. int main()
  57. {
  58. try
  59. {
  60. boost::asio::io_context io_context(1);
  61. boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
  62. signals.async_wait([&](auto, auto){ io_context.stop(); });
  63. co_spawn(io_context, listener, detached);
  64. io_context.run();
  65. }
  66. catch (std::exception& e)
  67. {
  68. std::printf("Exception: %s\n", e.what());
  69. }
  70. }