我有一个关于使用boost asio的async_read_until的一般性问题。文档说调用处理程序时缓冲区内可能有更多数据。有没有办法解决这个问题,并在序列条件匹配后立即停止缓冲区消耗来自套接字的字节?
答案 0 :(得分:1)
问。有没有办法解决这个问题
不直接,因为网络流量的工作方式(以数据包为导向)。
当然,如果发送方主动确认,可能可以在协议边界上获取内容,但这对于流协议来说是不常见的。
问。并在匹配序列条件后立即停止缓冲区从套接字中消耗字节数?
不,但您可以停止使用缓冲区。所以,例如这是一个有效的模式:
boost::asio::streambuf sb;
auto bytes = boost::asio::read_until(socket, sb, "\r\n\r\n");
std::istream is(&sb);
std::string line;
while (getline(is, line) && !line.empty()) {
std::cout << "Received: '" << line << "'\n";
}
// sb still contains un-consumed data, if any
只需对后续读取使用相同的streambuf
,它就会为您管理“流位置”。