I'm trying to build a general tcp_server a template, and I want to forward some parameters to the client class after the connection is created. However, the client object creation happens only after he has connected, and not during the tcp_server construction. How do I pass the parameters from the tcp_server constructor to the client constructor ? The parameters shouldn't be copied, only referenced.
The code bellow is what I've modeled so far, but I'm not sure how to forward the client object parameters.
template<class client_connection, typename... client_parameters>
class tcp_server
{
private:
tcp_server(const tcp_server&) = delete;
tcp_server& operator=(const tcp_server&) = delete;
boost::asio::io_service& io_service;
boost::asio::ip::tcp::acceptor acceptor;
boost::asio::ip::tcp::socket socket;
void start_accept()
{
acceptor.async_accept(socket, [this](const boost::system::error_code& ec)
{
if (!ec)
{
std::make_shared<client_connection>(io_service, std::move(socket), client_params)->start();
}
start_accept();
});
}
public:
tcp_server(boost::asio::io_service& io_service, const std::string& address, const std::string& service, client_parameters&&...client_params)
:
io_service(io_service),
acceptor(io_service),
socket(io_service)
{
boost::asio::ip::tcp::resolver resolver(io_service);
boost::asio::ip::tcp::resolver::query query(address, service);
boost::asio::ip::tcp::endpoint endpoint = *resolver.resolve(query);
acceptor.open(endpoint.protocol());
acceptor.set_option(boost::asio::ip::tcp::acceptor::reuse_address(true));
acceptor.bind(endpoint);
acceptor.listen();
start_accept();
}
};
Aucun commentaire:
Enregistrer un commentaire