我使用一个小缓冲区(例如 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/