목록

2019년 7월 6일 토요일

[C++] boost asio TCP 비동기 에코 서버, 동기 클라이언트

boost asio aync echo server,
sync client


예제 살짝 변형해서 가져옴
클라는 quit 메시지 입력시 종료

서버

  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <memory>
  4. #include <utility>
  5. #include <boost/asio.hpp>
  6.  
  7. using boost::asio::ip::tcp;
  8.  
  9. class session
  10.         : public std::enable_shared_from_this<session>
  11. {
  12. public:
  13.         session(tcp::socket socket)
  14.                : socket_(std::move(socket))
  15.         {
  16.         }
  17.  
  18.         void start()
  19.         {
  20.                do_read();
  21.         }
  22.  
  23. private:
  24.         void do_read()
  25.         {
  26.                auto self(shared_from_this());
  27.                socket_.async_read_some(boost::asio::buffer(data_, max_length),
  28.                        [this, self](boost::system::error_code ec, std::size_t length)
  29.                {
  30.                        if (!ec)
  31.                        {
  32.                               do_write(length);
  33.                        }
  34.                });
  35.         }
  36.  
  37.         void do_write(std::size_t length)
  38.         {
  39.                auto self(shared_from_this());
  40.                boost::asio::async_write(socket_, boost::asio::buffer(data_, length),
  41.                        [this, self](boost::system::error_code ec, std::size_t /*length*/)
  42.                {
  43.                        if (!ec)
  44.                        {
  45.                               do_read();
  46.                        }
  47.                });
  48.         }
  49.  
  50.         tcp::socket socket_;
  51.         enum { max_length = 1024 };
  52.         char data_[max_length];
  53. };
  54.  
  55. class server
  56. {
  57. public:
  58.         server(boost::asio::io_context& io_context, short port)
  59.                : acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
  60.         {
  61.                do_accept();
  62.         }
  63.  
  64. private:
  65.         void do_accept()
  66.         {
  67.                acceptor_.async_accept(
  68.                        [this](boost::system::error_code ec, tcp::socket socket)
  69.                {
  70.                        if (!ec)
  71.                        {
  72.                               std::make_shared<session>(std::move(socket))->start();
  73.                        }
  74.  
  75.                        do_accept();
  76.                });
  77.         }
  78.  
  79.         tcp::acceptor acceptor_;
  80. };
  81.  
  82. int main()
  83. {
  84.         try
  85.         {
  86.                boost::asio::io_context io_context;
  87.  
  88.                server s(io_context, 13);
  89.  
  90.                io_context.run();
  91.         }
  92.         catch (std::exception& e)
  93.         {
  94.                std::cerr << "Exception: " << e.what() << "\n";
  95.         }
  96.  
  97.         return 0;
  98. }



클라이언트

  1. #include <cstdlib>
  2. #include <cstring>
  3. #include <iostream>
  4. #include <boost/asio.hpp>
  5.  
  6. using boost::asio::ip::tcp;
  7.  
  8. enum { max_length = 1024 };
  9.  
  10. int main()
  11. {
  12.         try
  13.         {
  14.                boost::asio::io_context io_context;
  15.  
  16.                tcp::socket s(io_context);
  17.                tcp::resolver resolver(io_context);
  18.                boost::asio::connect(s, resolver.resolve("127.0.0.1", "13"));
  19.                for (;;)
  20.                {
  21.                        std::cout << "Enter message: ";
  22.                        char request[max_length];
  23.                        std::cin.getline(request, max_length);
  24.                        if (strcmp(request, "quit") == 0)
  25.                        {
  26.                               break;
  27.                        }
  28.  
  29.                        size_t request_length = std::strlen(request);
  30.                        boost::asio::write(s, boost::asio::buffer(request, request_length));
  31.  
  32.                        char reply[max_length];
  33.                        size_t reply_length = boost::asio::read(s,
  34.                               boost::asio::buffer(reply, request_length));
  35.                        std::cout << "Reply is: ";
  36.                        std::cout.write(reply, reply_length);
  37.                        std::cout << "\n";
  38.                }
  39.         }
  40.         catch (std::exception& e)
  41.         {
  42.                std::cerr << "Exception: " << e.what() << "\n";
  43.         }
  44.  
  45.         return 0;
  46. }

댓글 없음:

댓글 쓰기

목록