echo_server.cpp 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. //
  2. // echo_server.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;
  22. namespace this_coro = boost::asio::this_coro;
  23. awaitable<void> echo(tcp::socket socket)
  24. {
  25. try
  26. {
  27. char data[1024];
  28. for (;;)
  29. {
  30. std::size_t n = co_await socket.async_read_some(boost::asio::buffer(data), use_awaitable);
  31. co_await async_write(socket, boost::asio::buffer(data, n), use_awaitable);
  32. }
  33. }
  34. catch (std::exception& e)
  35. {
  36. std::printf("echo Exception: %s\n", e.what());
  37. }
  38. }
  39. awaitable<void> listener()
  40. {
  41. auto executor = co_await this_coro::executor;
  42. tcp::acceptor acceptor(executor, {tcp::v4(), 55555});
  43. for (;;)
  44. {
  45. tcp::socket socket = co_await acceptor.async_accept(use_awaitable);
  46. co_spawn(executor,
  47. [socket = std::move(socket)]() mutable
  48. {
  49. return echo(std::move(socket));
  50. },
  51. detached);
  52. }
  53. }
  54. int main()
  55. {
  56. try
  57. {
  58. boost::asio::io_context io_context(1);
  59. boost::asio::signal_set signals(io_context, SIGINT, SIGTERM);
  60. signals.async_wait([&](auto, auto){ io_context.stop(); });
  61. co_spawn(io_context, listener, detached);
  62. io_context.run();
  63. }
  64. catch (std::exception& e)
  65. {
  66. std::printf("Exception: %s\n", e.what());
  67. }
  68. }