1
0

asio_echo.cpp 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. //
  2. // async_tcp_echo_server.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2008 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::tcp;
  15. class session {
  16. public:
  17. session(boost::asio::io_service& io_service) :
  18. socket_(io_service) {
  19. }
  20. tcp::socket& socket() {
  21. return socket_;
  22. }
  23. void start() {
  24. socket_.async_read_some(boost::asio::buffer(data_, max_length),
  25. boost::bind(&session::handle_read, this,
  26. boost::asio::placeholders::error,
  27. boost::asio::placeholders::bytes_transferred));
  28. }
  29. void handle_read(const boost::system::error_code& error,
  30. size_t bytes_transferred) {
  31. if (!error) {
  32. boost::asio::async_write(socket_, boost::asio::buffer(data_,
  33. bytes_transferred), boost::bind(&session::handle_write,
  34. this, boost::asio::placeholders::error));
  35. } else {
  36. delete this;
  37. }
  38. }
  39. void handle_write(const boost::system::error_code& error) {
  40. if (!error) {
  41. socket_.async_read_some(boost::asio::buffer(data_, max_length),
  42. boost::bind(&session::handle_read, this,
  43. boost::asio::placeholders::error,
  44. boost::asio::placeholders::bytes_transferred));
  45. } else {
  46. delete this;
  47. }
  48. }
  49. private:
  50. tcp::socket socket_;
  51. enum {
  52. max_length = 1024
  53. };
  54. char data_[max_length];
  55. };
  56. class server {
  57. public:
  58. server(boost::asio::io_service& io_service, short port) :
  59. io_service_(io_service), acceptor_(io_service, tcp::endpoint(tcp::v4(),
  60. port)) {
  61. session* new_session = new session(io_service_);
  62. acceptor_.async_accept(new_session->socket(), boost::bind(
  63. &server::handle_accept, this, new_session,
  64. boost::asio::placeholders::error));
  65. }
  66. void handle_accept(session* new_session,
  67. const boost::system::error_code& error) {
  68. if (!error) {
  69. new_session->start();
  70. new_session = new session(io_service_);
  71. acceptor_.async_accept(new_session->socket(), boost::bind(
  72. &server::handle_accept, this, new_session,
  73. boost::asio::placeholders::error));
  74. } else {
  75. delete new_session;
  76. }
  77. }
  78. private:
  79. boost::asio::io_service& io_service_;
  80. tcp::acceptor acceptor_;
  81. };
  82. int main(int argc, char** argv) {
  83. if (argc < 2) {
  84. printf("Usage: cmd port\n");
  85. return -10;
  86. }
  87. int port = atoi(argv[1]);
  88. boost::asio::io_service io_service;
  89. server s(io_service, port);
  90. io_service.run();
  91. return 0;
  92. }