Попробуйте прочитать определенное количество данных из потока перед возвращением.
template<
typename SyncReadStream,
typename MutableBufferSequence,
typename CompletionCondition>
std::size_t read(
SyncReadStream & s,
const MutableBufferSequence & buffers,
CompletionCondition completion_condition);
Эта функция используется для чтения определенного количества байтов данных из потока. Звонок будет блокироваться до тех пор, пока не будет выполнено одно из следующих условий:
- Поставляемые буферы заполнены. То есть переданные байты равны сумме буферных размеров.
- Объект функции завершения_условия возвращает 0.
Эта операция реализована с точки зрения нуля или более вызовов функции read_some потока.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию SyncReadStream.
- buffers
Один или несколько буферов, в которые будут считываться данные. Сумма размеров буфера указывает на максимальное количество байтов для чтения из потока.
- completion_condition
-
Объект функции должен быть вызван, чтобы определить, завершена ли операция чтения. Подпись объекта функции должна быть:
std::size_t completion_condition(
const boost::system::error_code& error,
std::size_t bytes_transferred
);
Обратное значение 0 означает, что операция чтения завершена. Значение ненулевого возврата указывает максимальное количество байтов, которые будут прочитаны при следующем вызове функции read_some потока.
Количество переданных байтов.
- boost::system::system_error
Выброшен на провал.
Для считывания в единый буфер данных используют функциюбуфер
:
boost::asio::read(s, boost::asio::buffer(data, size),
boost::asio::transfer_at_least(32));
См.буфер
документация для информации о считывании в несколько буферов за один ход, и как ее использовать с массивами, бустер::array или std::vector.