boost ASIO : How to use limited buffer size with async_read_until

标签 boost boost-asio

我使用一个小缓冲区(例如 128 字节),并且我想对 TCP 连接上的大传入消息使用“async_read_until”(丢弃除分隔符之前的最后 128 字节之外的所有字节)。

如何做到这一点? ASIO 文档不太清楚当提供的缓冲区不够大时会发生什么。

这是我的读取初始化代码

typedef boost::shared_ptr<boost::asio::streambuf >streambuf_ptr;
streambuf_ptr inBuf(new boost::asio::streambuf (128));
boost::asio::async_read_until(*sock, *inBuf, "\r\n\r\n", boost::bind(my_read_handler, sock, inBuf, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

最佳答案

当提供的缓冲区不够大时,async_read_until 会完全填充它,然后使用错误代码 asio::error::not_found 调用读取处理程序,这意味着未找到分隔符。

此时,您可以.consume() 缓冲区中的部分(或全部)数据并再次调用async_read_until。对于 128 字节的缓冲区,可能很难保证当最终找到分隔符时,它恰好位于缓冲区中的最后一个位置(即使如此,对于四字节分隔符,您也只能找到最后一个分隔符)之前的 124 字节)。最好在 not_found 错误处理程序中使用更大的缓冲区和 buffer.consume(buffer.size()-128),以确保至少有 128 个字节随时免费。

关于 boost ASIO : How to use limited buffer size with async_read_until,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7287898/

相关文章:

c++ - Boost::Bind noncopyable error with shared_ptr <tcp::socket>

c++ - 解析函数在 boost/asio 中不起作用

c++ - 我的数据结构的最佳序列化方法?

c++ - 使用 Boost 1.53 的链接阶段 undefined reference

c++ - 在 boost::asio 服务器中使用 p12 容器

c++ - Boost MSM编译 boost

c++ - boost::asio 是否支持本地内存连接?

c++ - boost::asio async_read 保证读取所有字节

c++ - Google::protobuf + boost::asio 失败

c++ - 有没有办法打印 boost 程序选项的配置文件