我正在学习 Boost::asio 和异步编程。如何使用类型为 std::string 的变量 user_ 进行异步读取?Boost::asio::buffer(user_) 只能与 async_write() 一起使用,而不能与 async_read() 一起使用。它可以与 vector 一起使用,那么它不能与字符串一起使用的原因是什么?除了声明 char user_[max_len] 并使用 Boost::asio::buffer(user_, max_len) 外,是否还有其他方法实现异步读取?
此外,在 async_read() 和 async_write() 中继承 boost::enable_shared_from_this<Connection> 并使用 shared_from_this() 而不是 this 的目的是什么?我在很多示例中看到过这种用法。
这是我的一部分代码:
此外,在 async_read() 和 async_write() 中继承 boost::enable_shared_from_this<Connection> 并使用 shared_from_this() 而不是 this 的目的是什么?我在很多示例中看到过这种用法。
这是我的一部分代码:
class Connection
{
public:
Connection(tcp::acceptor &acceptor) :
acceptor_(acceptor),
socket_(acceptor.get_io_service(), tcp::v4())
{ }
void start()
{
acceptor_.get_io_service().post(
boost::bind(&Connection::start_accept, this));
}
private:
void start_accept()
{
acceptor_.async_accept(socket_,
boost::bind(&Connection::handle_accept, this,
placeholders::error));
}
void handle_accept(const boost::system::error_code& err)
{
if (err)
{
disconnect();
}
else
{
async_read(socket_, boost::asio::buffer(user_),
boost::bind(&Connection::handle_user_read, this,
placeholders::error, placeholders::bytes_transferred));
}
}
void handle_user_read(const boost::system::error_code& err,
std::size_t bytes_transferred)
{
if (err)
{
disconnect();
}
else
{
...
}
}
...
void disconnect()
{
socket_.shutdown(tcp::socket::shutdown_both);
socket_.close();
socket_.open(tcp::v4());
start_accept();
}
tcp::acceptor &acceptor_;
tcp::socket socket_;
std::string user_;
std::string pass_;
...
};
asio::streambuf
是它唯一能够使用的可变大小缓冲区。正如MikeC所指出的那样,这是一种数据复制,但是当std::string
增长时,它也会进行内部复制。请注意,提取方法operator>>
是iostream中通常的空格解析方法。您还可以在istream
上调用getline
。 - MSalters