목록

2019년 7월 4일 목요일

[C++] boost 1.70 asio TCP 비동기 데이트 타임 출력 서버

그냥 홈페이지에 나와있는 예제임

TCP 서버

  1. #include <ctime>
  2. #include <iostream>
  3. #include <string>
  4. #include <memory>
  5. #include <boost/asio.hpp>
  6. #include <boost/bind.hpp>
  7.  
  8. using boost::asio::ip::tcp;
  9.  
  10. std::string make_daytime_string()
  11. {
  12.         using namespace std;
  13.         time_t now = time(0);
  14.         return ctime(&now);
  15. }
  16.  
  17. class tcp_connection : public std::enable_shared_from_this<tcp_connection>
  18. {
  19.         tcp::socket socket_;
  20.         std::string message_;
  21. public:
  22.         using pointer = std::shared_ptr<tcp_connection>;
  23.  
  24.         static pointer create(boost::asio::io_context& io_context)
  25.         {
  26.                return pointer(new tcp_connection(io_context));
  27.         }
  28.  
  29.         tcp::socket& socket()
  30.         {
  31.                return socket_;
  32.         }
  33.  
  34.         void start()
  35.         {
  36.                message_ = make_daytime_string();
  37.                boost::asio::async_write(socket_, boost::asio::buffer(message_)
  38.                        , boost::bind(&tcp_connection::handle_write
  39.                               , shared_from_this()
  40.                               , boost::asio::placeholders::error
  41.                               , boost::asio::placeholders::bytes_transferred));
  42.         }
  43. private:
  44.         tcp_connection(boost::asio::io_context& io_context) : socket_(io_context){}
  45.         void handle_write(const boost::system::error_code&, size_t) {}
  46. };
  47.  
  48. class tcp_server
  49. {
  50.         boost::asio::io_context& io_context_;
  51.         tcp::acceptor acceptor_;
  52. public:
  53.         tcp_server(boost::asio::io_context& io_context)
  54.                : io_context_(io_context)
  55.                , acceptor_(io_context, tcp::endpoint(tcp::v4(), 13))
  56.         {
  57.                start_accept();
  58.         }
  59.  
  60. private:
  61.         void start_accept()
  62.         {
  63.                tcp_connection::pointer new_connection = tcp_connection::create(io_context_);
  64.                acceptor_.async_accept(new_connection->socket(),
  65.                        boost::bind(&tcp_server::handle_accept, this, new_connection,
  66.                               boost::asio::placeholders::error));
  67.         }
  68.         void handle_accept(tcp_connection::pointer new_connection,
  69.                const boost::system::error_code& error)
  70.         {
  71.                if (!error)
  72.                {
  73.                        new_connection->start();
  74.                }
  75.                start_accept();
  76.         }
  77. };
  78.  
  79. int main()
  80. {
  81.         try
  82.         {
  83.                boost::asio::io_context io_context;
  84.                tcp_server server(io_context);
  85.                io_context.run();
  86.         }
  87.         catch (std::exception& e)
  88.         {
  89.                std::cerr << e.what() << std::endl;
  90.         }
  91.         return 0;
  92. }



TCP 클라이언트

  1. #include <iostream>
  2. #include <array>
  3. #include <boost/asio.hpp>
  4.  
  5. using boost::asio::ip::tcp;
  6.  
  7. int main()
  8. {
  9.         try
  10.         {
  11.                boost::asio::io_service io_service;
  12.                tcp::resolver resolver(io_service);
  13.                tcp::resolver::query query("127.0.0.1", "daytime");
  14.                tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
  15.                tcp::socket socket(io_service);
  16.                boost::asio::connect(socket, endpoint_iterator);
  17.                for (;;)
  18.                {
  19.                        std::array<char, 128> buf;
  20.                        boost::system::error_code error;
  21.  
  22.                        size_t len = socket.read_some(boost::asio::buffer(buf), error);
  23.                        if (error == boost::asio::error::eof)
  24.                               break; // Connection closed cleanly by peer.
  25.                        else if (error)
  26.                               throw boost::system::system_error(error); // Some other error.
  27.  
  28.                        std::cout.write(buf.data(), len);
  29.                }
  30.         }
  31.         catch (std::exception& e)
  32.         {
  33.                std::cerr << e.what() << std::endl;
  34.         }
  35.         return 0;
  36. }

댓글 없음:

댓글 쓰기

목록