BOOST ASIO:如何在async_read_until中使用有限的缓冲区大小

Gab*_*iMe 2 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));
Run Code Online (Sandbox Code Playgroud)

Cub*_*bbi 5

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

此时,您可以.consume()从缓冲区中获取一些(或所有)数据并async_read_until再次调用.使用128字节缓冲区可能很难保证,当最终找到分隔符时,它位于缓冲区中的最后一个位置(即使这样,使用四字节分隔符,您也只能使用最后一个分隔符)它之前的124个字节).最好buffer.consume(buffer.size()-128)not_found错误处理程序中使用更大的缓冲区,以确保始终至少有128个字节空闲.