Boost
C++ Libraries
...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
This is an older version of Boost and was released in 2023. The current version is 1.89.0.
This tutorial program shows how to combine the two asynchronous servers that we have just written, into a single server application.
int main() { try { boost::asio::io_context io_context;
We will begin by creating a server object to accept a TCP client connection.
tcp_server server1(io_context);
We also need a server object to accept a UDP client request.
udp_server server2(io_context);
We have created two lots of work for the io_context object to do.
io_context.run(); } catch (std::exception& e) { std::cerr << e.what() << std::endl; } return 0; }
The following two classes are taken from Daytime.3.
class tcp_connection : public boost::enable_shared_from_this<tcp_connection> { public: typedef boost::shared_ptr<tcp_connection> pointer; static pointer create(boost::asio::io_context& io_context) { return pointer(new tcp_connection(io_context)); } tcp::socket& socket() { return socket_; } void start() { message_ = make_daytime_string(); boost::asio::async_write(socket_, boost::asio::buffer(message_), boost::bind(&tcp_connection::handle_write, shared_from_this())); } private: tcp_connection(boost::asio::io_context& io_context) : socket_(io_context) { } void handle_write() { } tcp::socket socket_; std::string message_; }; class tcp_server { public: tcp_server(boost::asio::io_context& io_context) : io_context_(io_context), acceptor_(io_context, tcp::endpoint(tcp::v4(), 13)) { start_accept(); } private: void start_accept() { tcp_connection::pointer new_connection = tcp_connection::create(io_context_); acceptor_.async_accept(new_connection->socket(), boost::bind(&tcp_server::handle_accept, this, new_connection, boost::asio::placeholders::error)); } void handle_accept(tcp_connection::pointer new_connection, const boost::system::error_code& error) { if (!error) { new_connection->start(); } start_accept(); } boost::asio::io_context& io_context_; tcp::acceptor acceptor_; };
Similarly, this next class is taken from the previous tutorial step.
class udp_server { public: udp_server(boost::asio::io_context& io_context) : socket_(io_context, udp::endpoint(udp::v4(), 13)) { start_receive(); } private: void start_receive() { socket_.async_receive_from( boost::asio::buffer(recv_buffer_), remote_endpoint_, boost::bind(&udp_server::handle_receive, this, boost::asio::placeholders::error)); } void handle_receive(const boost::system::error_code& error) { if (!error) { boost::shared_ptr<std::string> message( new std::string(make_daytime_string())); socket_.async_send_to(boost::asio::buffer(*message), remote_endpoint_, boost::bind(&udp_server::handle_send, this, message)); start_receive(); } } void handle_send(boost::shared_ptr<std::string> /*message*/) { } udp::socket socket_; udp::endpoint remote_endpoint_; boost::array<char, 1> recv_buffer_; };
See the full source listing
Return to the tutorial index