【发布时间】:2018-04-01 11:57:28
【问题描述】:
我有一个关于使用 boost asio 的 async_read_until 的一般性问题。文档说调用处理程序时缓冲区内可能有更多数据。有没有办法解决这个问题并在序列条件匹配后立即停止缓冲区从套接字消耗字节?
【问题讨论】:
标签: c++ boost tcp network-programming boost-asio
我有一个关于使用 boost asio 的 async_read_until 的一般性问题。文档说调用处理程序时缓冲区内可能有更多数据。有没有办法解决这个问题并在序列条件匹配后立即停止缓冲区从套接字消耗字节?
【问题讨论】:
标签: c++ boost tcp network-programming boost-asio
问。有没有办法解决这个问题
不是直接的,因为网络流量的工作方式(它是面向数据包的)。
当然,如果发送方积极确保它可能在协议边界上得到一些东西,但这对于流协议来说是不寻常的。
Q.并在序列条件匹配后立即停止缓冲区消耗来自套接字的字节?
不,但您可以停止使用缓冲区。所以,例如这是一个有效的模式:
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,它就会为您管理“流位置”。
【讨论】: