gpt4 book ai didi

c++ - asio::async_read_until:处理多行的稳健而优雅的方式

转载 作者:行者123 更新时间:2023-11-28 02:16:17 24 4
gpt4 key购买 nike

我正在使用带有 '\n' 分隔符的 asio::async_read_until 来支持从服务器获取字符数据的 TCP 客户端。此服务器不断发送 '\n' 终止行;准确地说,它可以同时写入单行或多行的串联字符串。

从文档中,我了解到 asio::async_read_until 可以读取:

  • 一个 '\n' 终止行,如 "some_data\n"。这是最简单的情况,通过在与 asio::streambuf
  • 关联的流上调用 std::getline 来处理
  • 一个 '\n' 终止行加上下一行的开头,例如 "some_data1\nbla"。这可以用 std::getline 处理;第二行的其余部分将在下一次完成处理程序调用时处理。
  • 多行;在这种情况下,新读取的数据可能包含 2 个或更多 '\n'。我怎么知道我应该执行多少次 std::getline 调用,知道我不想冒险在不完整的行上调用 std::getline(我最终会进入 future 的数据包)?我是否应该查看流缓冲区以检查是否存在多个 '\n'?不做很多拷贝甚至可能吗?

最佳答案

来自此处的文档:

http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio/reference/async_read_until/overload1.html

如果流缓冲区已经包含换行符,则将调用处理程序,而不会在流上执行 async_read_some 操作。

因此,当您的处理程序执行时,您必须执行不超过一个 getline()getline 返回并且您已完成处理后,只需从处理程序中再次调用 async_read_until

例子:

void handler(const boost::system::error_code& e, std::size_t size)
{
if (e)
{
// handle error here
}
else
{
std::istream is(&b);
std::string line;
std::getline(is, line);
do_something(line)
boost::asio::async_read_until(s, b, '\n', handler);
}
}

// Call the async read operation
boost::asio::async_read_until(s, b, '\n', handler);

关于c++ - asio::async_read_until:处理多行的稳健而优雅的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33937754/

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