gpt4 book ai didi

string - 如何使用 Boost::asio 异步读取 std::string?

转载 作者:行者123 更新时间:2023-12-03 22:49:12 25 4
gpt4 key购买 nike

我正在学习 Boost::asio 和所有异步的东西。如何异步读取变量 user_ std::string 类型的? Boost::asio::buffer(user_)仅适用于 async_write() , 但不是 async_read() .它适用于矢量,那么它不适用于字符串的原因是什么?除了声明 char user_[max_len] 之外,还有其他方法吗?并使用 Boost::asio::buffer(user_, max_len) ?

另外,从 boost::enable_shared_from_this<Connection> 继承有什么意义?并使用 shared_from_this()而不是 thisasync_read()async_write() ?我在例子中看到了很多。

这是我的代码的一部分:

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 缓冲区转换为字符串的一种非常简单的方法是从中流式传输:

asio::streambuf buff;
asio::read_until(source, buff, '\r'); // for example

istream is(&buff);
is >> targetstring;

当然,这是一个数据副本,但如果您想将它放在一个字符串中,那就是您需要做的。

关于string - 如何使用 Boost::asio 异步读取 std::string?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2790383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com