Запуск асинхронной операции для считывания определенного количества данных при указанном смещении.
template<
typename AsyncRandomAccessReadDevice,
typename MutableBufferSequence,
typename ReadHandler>
void-or-deduced async_read_at(
AsyncRandomAccessReadDevice & d,
uint64_t offset,
const MutableBufferSequence & buffers,
ReadHandler handler);
Эта функция используется для асинхронного считывания определенного количества байтов данных с устройства случайного доступа при указанном смещении. Звонок функции всегда возвращается немедленно. Асинхронная операция будет продолжаться до тех пор, пока не будет выполнено одно из следующих условий:
- Поставляемые буферы заполнены. То есть переданные байты равны сумме буферных размеров.
- Произошла ошибка.
Эта операция реализована с точки зрения нуля или более вызовов функции async_read_some_at устройства.
- d
Устройство, с которого следует считывать данные. Этот тип должен поддерживать концепцию AsyncRandomAccessReadDevice.
- offset
Смещение, при котором будут считаны данные.
- buffers
Один или несколько буферов, в которые будут считываться данные. Сумма размеров буфера указывает на максимальное количество байт для чтения с устройства. Хотя объект буферов может быть скопирован по мере необходимости, право собственности на базовые блоки памяти сохраняется абонентом, который должен гарантировать, что они остаются действительными до тех пор, пока обработчик не будет вызван.
- handler
-
Обработчик должен быть вызван, когда операция чтения завершится. Копии будут сделаны из обработчика по мере необходимости. Функциональная подпись обработчика должна быть:
void handler(
const boost::system::error_code& error,
std::size_t bytes_transferred
);
Независимо от того, выполняется ли асинхронная операция немедленно или нет, обработчик не будет вызываться из этой функции. Применительно к нему следует использовать<boost::asio::io_service::post()
>.
Для считывания в единый буфер данных используют функцию<buffer
>:
boost::asio::async_read_at(d, 42, boost::asio::buffer(data, size), handler);
См. документацию<buffer
>для информации о считывании в несколько буферов за один раз, и как использовать ее с массивами, нарастить::array или std::vector.
Эта перегрузка эквивалентна вызову:
boost::asio::async_read_at(
d, 42, buffers,
boost::asio::transfer_all(),
handler);