Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2014
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.08 KB | None | 0 0
  1. //
  2. // async_tcp_echo_server.cpp
  3. // ~~~~~~~~~~~~~~~~~~~~~~~~~
  4. //
  5. // Copyright (c) 2003-2013 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.  
  11. #include <cstdlib>
  12. #include <iostream>
  13. #include <boost/bind.hpp>
  14. #include <boost/asio.hpp>
  15.  
  16. using boost::asio::ip::tcp;
  17.  
  18. class session
  19. {
  20. public:
  21. session(boost::asio::io_service& io_service)
  22. : socket_(io_service)
  23. {
  24. }
  25.  
  26. tcp::socket& socket()
  27. {
  28. return socket_;
  29. }
  30.  
  31. void start()
  32. {
  33. socket_.async_read_some(boost::asio::buffer(data_, max_length),
  34. boost::bind(&session::handle_read, this,
  35. boost::asio::placeholders::error,
  36. boost::asio::placeholders::bytes_transferred));
  37. }
  38.  
  39. private:
  40. void handle_read(const boost::system::error_code& error,
  41. size_t bytes_transferred)
  42. {
  43. if (!error)
  44. {
  45. std::cerr <<"Data received(" <<bytes_transferred <<") : " <<data_ <<"\n";
  46. boost::asio::async_write(socket_,
  47. boost::asio::buffer(data_, bytes_transferred),
  48. boost::bind(&session::handle_write, this,
  49. boost::asio::placeholders::error));
  50. }
  51. else
  52. {
  53. delete this;
  54. }
  55. }
  56.  
  57. void handle_write(const boost::system::error_code& error)
  58. {
  59. if (!error)
  60. {
  61. socket_.async_read_some(boost::asio::buffer(data_, max_length),
  62. boost::bind(&session::handle_read, this,
  63. boost::asio::placeholders::error,
  64. boost::asio::placeholders::bytes_transferred));
  65. }
  66. else
  67. {
  68. delete this;
  69. }
  70. }
  71.  
  72. tcp::socket socket_;
  73. enum { max_length = 1024 };
  74. char data_[max_length];
  75. };
  76.  
  77. class server
  78. {
  79. public:
  80. server(boost::asio::io_service& io_service, short port)
  81. : io_service_(io_service),
  82. acceptor_(io_service, tcp::endpoint(tcp::v4(), port))
  83. {
  84. std::cerr <<"Accepting " <<tcp::endpoint(tcp::v4(), port) <<"\n";
  85. start_accept();
  86. }
  87.  
  88. private:
  89. void start_accept()
  90. {
  91. session* new_session = new session(io_service_);
  92. acceptor_.async_accept(new_session->socket(),
  93. boost::bind(&server::handle_accept, this, new_session,
  94. boost::asio::placeholders::error));
  95. }
  96.  
  97. void handle_accept(session* new_session,
  98. const boost::system::error_code& error)
  99. {
  100. if (!error)
  101. {
  102. new_session->start();
  103. }
  104. else
  105. {
  106. delete new_session;
  107. }
  108.  
  109. start_accept();
  110. }
  111.  
  112. boost::asio::io_service& io_service_;
  113. tcp::acceptor acceptor_;
  114. };
  115.  
  116. int main(int argc, char* argv[])
  117. {
  118. try
  119. {
  120. if (argc != 2)
  121. {
  122. std::cerr << "Usage: async_tcp_echo_server <port>\n";
  123. return 1;
  124. }
  125.  
  126. boost::asio::io_service io_service;
  127.  
  128. using namespace std; // For atoi.
  129. std::cerr <<"You setted to listen port " <<atoi(argv[1]) <<"\n";
  130. server s(io_service, atoi(argv[1]));
  131.  
  132. io_service.run();
  133. }
  134. catch (std::exception& e)
  135. {
  136. std::cerr << "Exception: " << e.what() << "\n";
  137. }
  138.  
  139. return 0;
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement