async_udp_echo_server.cc 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. //
  2. // async_udp_echo_server.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2010 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 <boost/bind.hpp>
  13. #include <boost/asio.hpp>
  14. using boost::asio::ip::udp;
  15. class server
  16. {
  17. public:
  18. server(boost::asio::io_service& io_service, short port) :
  19. io_service_(io_service), socket_(io_service, udp::endpoint(udp::v4(),
  20. port))
  21. {
  22. socket_.async_receive_from(boost::asio::buffer(data_, max_length),
  23. sender_endpoint_, boost::bind(&server::handle_receive_from,
  24. this, boost::asio::placeholders::error,
  25. boost::asio::placeholders::bytes_transferred));
  26. }
  27. void handle_receive_from(const boost::system::error_code& error,
  28. size_t bytes_recvd)
  29. {
  30. if (!error && bytes_recvd > 0)
  31. {
  32. socket_.async_send_to(boost::asio::buffer(data_, bytes_recvd),
  33. sender_endpoint_, boost::bind(&server::handle_send_to,
  34. this, boost::asio::placeholders::error,
  35. boost::asio::placeholders::bytes_transferred));
  36. }
  37. else
  38. {
  39. socket_.async_receive_from(boost::asio::buffer(data_, max_length),
  40. sender_endpoint_, boost::bind(&server::handle_receive_from,
  41. this, boost::asio::placeholders::error,
  42. boost::asio::placeholders::bytes_transferred));
  43. }
  44. }
  45. void handle_send_to(const boost::system::error_code& /*error*/, size_t /*bytes_sent*/)
  46. {
  47. socket_.async_receive_from(boost::asio::buffer(data_, max_length),
  48. sender_endpoint_, boost::bind(&server::handle_receive_from,
  49. this, boost::asio::placeholders::error,
  50. boost::asio::placeholders::bytes_transferred));
  51. }
  52. private:
  53. boost::asio::io_service& io_service_;
  54. udp::socket socket_;
  55. udp::endpoint sender_endpoint_;
  56. enum
  57. {
  58. max_length = 1024
  59. };
  60. char data_[max_length];
  61. };
  62. int main(int argc, char* argv[])
  63. {
  64. try
  65. {
  66. if (argc != 2)
  67. {
  68. std::cerr << "Usage: async_udp_echo_server <port>\n";
  69. return 1;
  70. }
  71. boost::asio::io_service io_service;
  72. using namespace std;
  73. // For atoi.
  74. server s(io_service, atoi(argv[1]));
  75. io_service.run();
  76. }
  77. catch (std::exception& e)
  78. {
  79. std::cerr << "Exception: " << e.what() << "\n";
  80. }
  81. return 0;
  82. }