c++ - 帮助 async_read_until

标签 c++ boost-asio

我在此处记录的函数中实现第三个参数时遇到问题: http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/reference/async_read_until/overload4.html 我想要做的是使用 async_read_until 的第三个参数的回调来检测完整 block 何时到达。我的数据包具有以下格式。

  • 1字节id(数据的语义)
  • unsigned int(数据中的字节数,因为一些数据 block 可以改变大小)
  • 有效载荷

查看文档中的示例代码,我对应该如何提取字节感到有点困惑,更不用说从开始和结束迭代器中提取 unsigned int 了。 我已经将我的迭代器实例化为 typedef boost::asio::buffers_iterator< boost::asio::streambuf::const_buffers_type> iterator;

但即便如此我也不确定那是什么类型,因为我不知道 const_buffers_type 是什么。我点击了文档中的一些链接,发现它是“实现定义的”,但我想我可能是错的。 所以我的两个具体问题是:

  1. 我如何使用这两个迭代器来读取 unsigned int?
  2. 这些迭代器指向什么类型?

谢谢!

最佳答案

文档中提供了示例匹配函数。

std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
  iterator i = begin;
  while (i != end)
    if (std::isspace(*i++))
      return std::make_pair(i, true);
  return std::make_pair(i, false);
}

在这里取消引用i,取出一个字节。您需要提取足够的字节来匹配一个 int。

但是请记住,回调并不是 read_until 的唯一选项。实际上它是最复杂的。您确定仅使用正则表达式还不够吗?

template<
    typename AsyncReadStream,
    typename Allocator,
    typename ReadHandler>
void async_read_until(
    AsyncReadStream & s,
    boost::asio::basic_streambuf< Allocator > & b,
    const boost::regex & expr,
    ReadHandler handler);

无论如何,考虑到您的读取没有定界,更好的方法是 async_read_some 直到您读取大小,然后 async_read_some 至少读取。

关于c++ - 帮助 async_read_until,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1993356/

相关文章:

c++ - 数组中最近点的索引,每个点包含3个元素

c++ - 检测算子 +

c++ - 使用 enable_if 禁用模板类的模板构造函数

c++ - boost::asio UDP 广播

C++ 输出文件

c++ - C++中如何解析 `auto a(b);`?

c++ - Boost asio - 多个 streambufs 还是每个连接一个?

c++ - 如何在 C++ 的 .json 文件中保存 HTTP GET 的 JSON 响应?

c++ - 使用线程超时 boost ASIO 线程池

c++ - 如何在 asio 中查找多播发件人地址?