main.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <iostream>
  2. #include <boost/asio.hpp>
  3. #include <boost/bind.hpp>
  4. #include <boost/enable_shared_from_this.hpp>
  5. using namespace boost::asio;
  6. using ip::tcp;
  7. using std::cout;
  8. using std::endl;
  9. class con_handler : public boost::enable_shared_from_this<con_handler> {
  10. private:
  11. tcp::socket sock;
  12. std::string message="Hello From Server!";
  13. enum { max_length = 1024 };
  14. char data[max_length];
  15. public:
  16. typedef boost::shared_ptr<con_handler> pointer;
  17. con_handler(boost::asio::io_service& io_service): sock(io_service){}
  18. static pointer create(boost::asio::io_service& io_service) {
  19. return pointer(new con_handler(io_service));
  20. }
  21. tcp::socket& socket(){return sock;}
  22. void start() {
  23. sock.async_read_some(
  24. boost::asio::buffer(data, max_length),
  25. boost::bind(&con_handler::handle_read, shared_from_this(),
  26. boost::asio::placeholders::error,
  27. boost::asio::placeholders::bytes_transferred));
  28. sock.async_write_some(
  29. boost::asio::buffer(message, max_length),
  30. boost::bind(&con_handler::handle_write, shared_from_this(),
  31. boost::asio::placeholders::error,
  32. boost::asio::placeholders::bytes_transferred));
  33. }
  34. void handle_read(const boost::system::error_code& err, size_t bytes_transferred) {
  35. if (!err) {cout << data << endl;}
  36. else {std::cerr << "error: " << err.message() << std::endl; sock.close();}
  37. }
  38. void handle_write(const boost::system::error_code& err, size_t bytes_transferred) {
  39. if (!err) {cout << "Hello World!"<< endl;}
  40. else {std::cerr << "error: " << err.message() << endl; sock.close();}
  41. }
  42. };
  43. class Server {
  44. private:
  45. tcp::acceptor acceptor_;
  46. void start_accept() {
  47. con_handler::pointer connection = con_handler::create(acceptor_.get_io_service());
  48. acceptor_.async_accept(connection->socket(), boost::bind(&Server::handle_accept, this, connection,
  49. boost::asio::placeholders::error));
  50. }
  51. public:
  52. Server(boost::asio::io_service& io_service): acceptor_(io_service, tcp::endpoint(tcp::v4(), 1234)) {
  53. start_accept();
  54. }
  55. void handle_accept(con_handler::pointer connection, const boost::system::error_code& err) {
  56. if (!err) {connection->start();}
  57. start_accept();
  58. }
  59. };
  60. int main(int argc, char *argv[]) {
  61. try {
  62. boost::asio::io_service io_service;
  63. Server server(io_service);
  64. io_service.run();
  65. }
  66. catch(std::exception& e) {std::cerr << e.what() << endl;}
  67. return 0;
  68. }