boost :: asio async_read гарантирует, что все байты прочитаны

У меня есть сервер, который получает сжатую строку (сжатую с помощью zlib) от клиента, и я использовал async_receive из библиотеки boost :: asio для получения эта строка, однако оказывается, что нет никакой гарантии, что все байты будут получены, поэтому теперь мне нужно изменить ее на async_read . Проблема, с которой я сталкиваюсь, заключается в том, что размер получаемых байтов является переменным, поэтому я не уверен, как использовать async_read , не зная количество байтов, которые должны быть получены. С async_receive у меня просто boost :: array , однако это буфер, который не обязательно заполняется полностью.

Я подумал, может ли кто-нибудь предложить решение, в котором я могу использовать async_read, даже если я не знаю количество байтов, которое нужно получить заранее?

void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler)
{
    if (!_queue_handler.get())
        _queue_handler = queue_handler;

    std::fill(buff.begin(), buff.end(), 0);

    //socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
    boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
}

buff - это boost :: array

6
задан Tony The Lion 8 February 2011 в 13:28
поделиться