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

时间:2011-09-02 18:42:18

标签: 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));

1 个答案:

答案 0 :(得分:5)

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

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