boost::asio::read_until数据获取重复问题

本文探讨使用Boost.Asio的read_until方法读取HTTP的Chunk包时遇到的问题及解决方案。若不适当处理,会导致重复读取包头内容。文中详细介绍了如何通过consume方法和字符串构造来避免这一问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用boost::asio::read_until读http的chunk包,读取部分代码如下:


第一部分读取包头,第二部分循环读chunk包

如果不调用consume清空的话,while循环里一直获取到的是包头部分的内容,consume的官方文档解析如下:


测试代码运行结果如下:


虽然调用了consume,但是boost::asio::buffer_cast<const char*>(sb.data())每次调用时会有部分历史数据,我解决的方法是调用string(char *, int)新增了个对象,如果有明白原因的请指教

`boost::asio::async_read_until` 是 Boost.Asio 库中的一个异步读取函数,用于从网络或其他流中读取数据直到遇到某个特定的终止符。如果想要停止并退出异步操作,通常会在回调函数中处理中断信号或者满足某个条件。 以下是一个基本的示例,展示了如何在 `async_read_until` 的完成事件处理器中控制退出: ```cpp #include <boost/asio.hpp> using boost::asio::ip::tcp; using boost::asio::streambuf; std::string terminator = "\r\n"; // 假设我们正在等待换行符作为结束标记 void read_handler(const boost::system::error_code& error, std::size_t bytes_transferred, boost::asio::streambuf& sb) { if (!error) { // 如果没有错误 std::string data(reinterpret_cast<const char*>(sb.data()), bytes_transferred); // 检查数据是否到达预期的终止符 if (data.rfind(terminator) != std::string::npos) { // 数据已完整读取,处理数据后可以停止操作 do_something_with_data(data); stop_async_operation(); // 假设有一个函数用于停止异步操作 } else { // 继续读取,直到找到终止符 boost::asio::async_read_until(socket_, sb, terminator, read_handler); } } else { // 错误发生,处理错误后可能需要退出 handle_error(error); } } int main() { tcp::socket socket(io_service); // 开始连接和建立流... boost::asio::async_read_until(socket, sb, terminator, read_handler); // 开始异步读取 io_service.run(); // 运行服务直至所有任务完成或被stop_async_operation()中断 return 0; } ``` 在这个例子中,当你希望停止读取时,可以在读取完成后的条件检查中调用 `stop_async_operation()`,这可能会关闭套接字或者设置一个标志通知主循环不再继续处理此任务。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值