在使用 acceptor.async_accept(*socket, accept_handler) 异步接受 tcp 连接后,我如何重用它?
我只想再次接受这个套接字...
最佳答案
打开接受器后,将其绑定(bind)到一个端点,这个端点就是您接受的对象,它(或者与其关联的套接字)将被重新使用。您传递给 async_accept 的套接字引用是一个新套接字,它将保存下一个传入连接。
例如在HTTP Server boost asio 示例:
server::server(const std::string& address, const std::string& port,
const std::string& doc_root)
: io_service_(),
acceptor_(io_service_),
connection_manager_(),
new_connection_(new connection(io_service_,
connection_manager_, request_handler_)),
request_handler_(doc_root)
{
// Open the acceptor with the option to reuse the address (i.e. SO_REUSEADDR).
boost::asio::ip::tcp::resolver resolver(io_service_);
boost::asio::ip::tcp::resolver::query query(address, port);
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();
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error));
}
为每个 async_accept 创建的 new_connection 对象都有一个新的套接字来接收传入的连接。接受器在内部保留一个用于接受与您传递给它的端点相关联的套接字。
如果您查看 handle_accept:
void server::handle_accept(const boost::system::error_code& e)
{
if (!e)
{
connection_manager_.start(new_connection_);
new_connection_.reset(new connection(io_service_,
connection_manager_, request_handler_));
acceptor_.async_accept(new_connection_->socket(),
boost::bind(&server::handle_accept, this,
boost::asio::placeholders::error));
}
}
您可以看到构造了一个新连接对象(并在其中创建了一个新套接字)来保存下一个传入连接。 new_connection_->socket() 返回对该套接字的引用。接受器仍在接受最初传递给它的同一套接字或端口。
关于c++ - 如何使用 boost::asio 保持套接字连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5757486/