I have the following example code, that implements a asynchronous server using boost::asio
I am trying to understand the code. The questions I have regarding the code are as follows
In function async_accept()
in class server
, the first statement is
socket.emplace(io_context)
From what I understand, this line call the socket constructor, create a socket. This socket is then passed to the session, usign std::move()
.
When the async_accept() is called again, in the last line of the funtion, a new socket is created. Is my understanding correct? Am I missing something?
#include <iostream>
#include <optional>
#include <boost/asio.hpp>
class session : public std::enable_shared_from_this<session>
{
public:
session(boost::asio::ip::tcp::socket&& socket)
: socket(std::move(socket))
{
}
void start()
{
boost::asio::async_read_until(socket, streambuf, '\n', [self = shared_from_this()] (boost::system::error_code error, std::size_t bytes_transferred)
{
std::cout << std::istream(&self->streambuf).rdbuf();
});
}
private:
boost::asio::ip::tcp::socket socket;
boost::asio::streambuf streambuf;
};
class server
{
public:
server(boost::asio::io_context& io_context, std::uint16_t port)
: io_context(io_context)
, acceptor (io_context, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), port))
{
}
void async_accept()
{
socket.emplace(io_context);
acceptor.async_accept(*socket, [&] (boost::system::error_code error)
{
std::make_shared<session>(std::move(*socket))->start();
async_accept();
});
}
private:
boost::asio::io_context& io_context;
boost::asio::ip::tcp::acceptor acceptor;
std::optional<boost::asio::ip::tcp::socket> socket;
};
int main()
{
boost::asio::io_context io_context;
server srv(io_context, 15001);
srv.async_accept();
io_context.run();
return 0;
}
Aucun commentaire:
Enregistrer un commentaire