提升asio async_read_until在匹配条件下停止读取

时间:2017-10-20 10:13:21

标签: c++ boost tcp network-programming boost-asio

我有一个关于使用boost asio的async_read_until的一般性问题。文档说调用处理程序时缓冲区内可能有更多数据。有没有办法解决这个问题,并在序列条件匹配后立即停止缓冲区消耗来自套接字的字节?

1 个答案:

答案 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,它就会为您管理“流位置”。