boost asio aync echo server,
sync client
예제 살짝 변형해서 가져옴
클라는 quit 메시지 입력시 종료
서버
- #include <cstdlib>
- #include <iostream>
- #include <memory>
- #include <utility>
- #include <boost/asio.hpp>
-
- using boost::asio::ip::tcp;
-
- class session
- : public std::enable_shared_from_this<session>
- {
- public:
- session(tcp::socket socket)
- :
socket_(std::move(socket))
- {
- }
-
- void start()
- {
- do_read();
- }
-
- private:
- void do_read()
- {
- auto
self(shared_from_this());
- socket_.async_read_some(boost::asio::buffer(data_,
max_length),
- [this,
self](boost::system::error_code ec, std::size_t length)
- {
- if (!ec)
- {
- do_write(length);
- }
- });
- }
-
- void do_write(std::size_t length)
- {
- auto
self(shared_from_this());
- boost::asio::async_write(socket_,
boost::asio::buffer(data_, length),
- [this,
self](boost::system::error_code ec, std::size_t /*length*/)
- {
- if (!ec)
- {
- do_read();
- }
- });
- }
-
- tcp::socket socket_;
- enum { max_length = 1024 };
- char data_[max_length];
- };
-
- class server
- {
- public:
- server(boost::asio::io_context& io_context, short port)
- :
acceptor_(io_context, tcp::endpoint(tcp::v4(), port))
- {
- do_accept();
- }
-
- private:
- void do_accept()
- {
- acceptor_.async_accept(
- [this](boost::system::error_code ec, tcp::socket socket)
- {
- if (!ec)
- {
- std::make_shared<session>(std::move(socket))->start();
- }
-
- do_accept();
- });
- }
-
- tcp::acceptor acceptor_;
- };
-
- int main()
- {
- try
- {
- boost::asio::io_context io_context;
-
- server s(io_context, 13);
-
- io_context.run();
- }
- catch (std::exception& e)
- {
- std::cerr
<< "Exception: " << e.what() << "\n";
- }
-
- return 0;
- }
|
클라이언트
- #include <cstdlib>
- #include <cstring>
- #include <iostream>
- #include <boost/asio.hpp>
-
- using boost::asio::ip::tcp;
-
- enum { max_length = 1024 };
-
- int main()
- {
- try
- {
- boost::asio::io_context io_context;
-
- tcp::socket s(io_context);
- tcp::resolver
resolver(io_context);
- boost::asio::connect(s,
resolver.resolve("127.0.0.1", "13"));
- for (;;)
- {
- std::cout
<< "Enter message: ";
- char request[max_length];
- std::cin.getline(request,
max_length);
- if (strcmp(request, "quit") == 0)
- {
- break;
- }
-
- size_t request_length =
std::strlen(request);
- boost::asio::write(s,
boost::asio::buffer(request, request_length));
-
- char reply[max_length];
- size_t reply_length =
boost::asio::read(s,
- boost::asio::buffer(reply,
request_length));
- std::cout
<< "Reply is: ";
- std::cout.write(reply,
reply_length);
- std::cout
<< "\n";
- }
- }
- catch (std::exception& e)
- {
- std::cerr
<< "Exception: " << e.what() << "\n";
- }
-
- return 0;
- }
|
댓글 없음:
댓글 쓰기