udp_echo_server.cpp 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. //
  2. // async_udp_echo_server.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2018 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 <cstdlib>
  11. #include <iostream>
  12. #include "asio.hpp"
  13. using asio::ip::udp;
  14. class server
  15. {
  16. public:
  17. server(asio::io_context& io_context, short port)
  18. : socket_(io_context, udp::endpoint(udp::v4(), port))
  19. {
  20. do_receive();
  21. }
  22. void do_receive()
  23. {
  24. socket_.async_receive_from(
  25. asio::buffer(data_, max_length), sender_endpoint_,
  26. [this](std::error_code ec, std::size_t bytes_recvd)
  27. {
  28. if (!ec && bytes_recvd > 0)
  29. {
  30. std::cout << data_ << std::endl;
  31. do_send(bytes_recvd);
  32. }
  33. else
  34. {
  35. do_receive();
  36. }
  37. });
  38. }
  39. void do_send(std::size_t length)
  40. {
  41. socket_.async_send_to(
  42. asio::buffer(data_, length), sender_endpoint_,
  43. [this](std::error_code /*ec*/, std::size_t bytes /*bytes_sent*/)
  44. {
  45. do_receive();
  46. });
  47. }
  48. private:
  49. udp::socket socket_;
  50. udp::endpoint sender_endpoint_;
  51. enum { max_length = 1024 };
  52. char data_[max_length];
  53. };
  54. void asio_main()
  55. {
  56. asio::io_context io_context;
  57. server s(io_context, std::atoi(CONFIG_EXAMPLE_PORT));
  58. io_context.run();
  59. }