我使用一个小缓冲区(例如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));
答案 0 :(得分:5)
当提供的缓冲区不够大时,async_read_until
完全填充它,然后使用错误代码asio::error::not_found
调用读处理程序,这意味着找不到分隔符。
此时,您可以.consume()
缓冲区中的部分(或全部)数据并再次呼叫async_read_until
。使用128字节缓冲区可能很难保证,当最终找到分隔符时,它位于缓冲区中的最后一个位置(即使这样,使用四字节分隔符,您也只能使用最后一个分隔符)它之前的124个字节)。最好在buffer.consume(buffer.size()-128)
错误处理程序中使用更大的缓冲区和not_found
,以确保始终至少有128个字节空闲。