这是应用程序级协议的领域
要么
- 读取直到流结束(发送方断开连接);这与保持活动状态超过一条消息的连接不起作用
- 提供一个标题,
Content-Length: 12346rn
以便提前知道要读多少 - 提供定界符(有点像mime边界,但是您可以使用JSON负载中不允许/不支持的任何序列)(
async_read_until
) - 将有效负载视为“二进制样式”(例如BSON),并在文本传输之前提供(网络顺序)长度字段。
ASIO
Http服务器示例包含一个很好的模式,用于解析您可以使用的HTTP请求/标头。假设您的解析器可以检测出完整性,只是“软失败”,直到出现所有信息为止。
void connection::handle_read(const boost::system::error_pre& e, std::size_t bytes_transferred){ if (!e) { boost::tribool result; boost::tie(result, boost::tuples::ignore) = request_parser_.parse( request_, buffer_.data(), buffer_.data() + bytes_transferred); if (result) { request_handler_.handle_request(request_, reply_); boost::asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), boost::asio::placeholders::error)); } else if (!result) { reply_ = reply::stock_reply(reply::bad_request); boost::asio::async_write(socket_, reply_.to_buffers(), boost::bind(&connection::handle_write, shared_from_this(), boost::asio::placeholders::error)); } else { socket_.async_read_some(boost::asio::buffer(buffer_), boost::bind(&connection::handle_read, shared_from_this(), boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)); } } else if (e != boost::asio::error::operation_aborted) { connection_manager_.stop(shared_from_this()); }}


