Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- В Boost.Asio для операций чтения и записи существует набор completion condition — функций или функциональных объектов, которые определяют, когда операция должна завершиться. Они используются в функциях boost::asio::read, boost::asio::async_read и подобных, чтобы контролировать, сколько данных читать или записывать.
- Основные стандартные completion conditions в Boost.Asio
- 1. boost::asio::transfer_all()
- Означает: продолжать чтение или запись, пока весь буфер не будет заполнен или пока не возникнет ошибка.
- Используется, когда нужно полностью прочитать или записать заданный буфер.
- 2. boost::asio::transfer_at_least(std::size_t minimum)
- Означает: продолжать операцию, пока не будет считано или записано не менее minimum байт.
- Полезно, когда нужно получить хотя бы определённое количество данных, но можно получить и больше.
- 3. boost::asio::transfer_exactly(std::size_t size)
- Означает: продолжать операцию, пока не будет считано или записано ровно size байт.
- Используется для точного контроля количества передаваемых данных.
- Как работают completion conditions
- Функция получает общее количество уже переданных байт.
- Возвращает количество байт, которое нужно передать в следующей операции чтения/записи.
- Если возвращается 0, операция завершается.
- Пример использования
- cpp
- boost::asio::read(socket, buffer, boost::asio::transfer_at_least(32));
- Операция будет читать из сокета, пока не будет получено минимум 32 байта.
- Можно ли создавать свои completion conditions?
- Да, можно передавать любую функцию или функциональный объект с сигнатурой:
- cpp
- std::size_t completion_condition(const boost::system::error_code& error, std::size_t bytes_transferred);
- Если возвращается 0 — операция завершается.
- Иначе — возвращённое число указывает, сколько байт читать/писать в следующей итерации.
- Резюме
- Completion Condition Описание
- transfer_all() Читать/писать весь буфер
- transfer_at_least(minimum) Читать/писать не менее minimum байт
- transfer_exactly(size) Читать/писать ровно size байт
- Пользовательская функция Своя логика завершения, возвращает 0 для окончания операции
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement