boost:: asio как правильно читать полный буфер?


Я изучаю boost::asio и теперь путаюсь в правильном способе чтения полного буфера. Например, когда соединение установлено, Я хочу прочитать uint32_t следующим образом:

std::uint32_t size;
size_t len = m_socket.read_some(buffer(&size, sizeof(std::uint32_t)));

Как вы видите, я настроил размер буфера. В другом случае я получил len с длиной по данным read_some.

Итак, главный вопрос: гарантируется ли boost::asio, что будут прочитаны все 4 байта uint32_t, Если я настрою необходимую длину буфера при вызове buffer?

Или если это не гарантировано - как я могу Читать полный буфер? (все 4 байта)

1 4

1 ответ:

Из read_some Ссылка:

Эта функция используется для чтения данных из сокета stream. Вызов функции будет блокироваться до тех пор, пока один или несколько байтов данных не будут прочитаны успешно, или пока не произойдет ошибка.

С замечаниями:

Операция read_someне может прочитать все из запрошенного количества байтов. Рассмотрите возможность использования функции read, Если вам необходимо убедиться, что запрошенный объем данных был прочитан до этого. операция блокировки завершена.

Так что либо вам придется вызвать read_some в цикле, либо просто позвонить read, который будет:

Блокируйте, пока не будет выполнено одно из следующих условий:

  • поставляемого буферов. То есть передаваемые байты равны сумме размеров буфера.
  • произошла ошибка.

Эта операция реализуется в терминах нуля или более вызовов потока read_some функция.

Использование read в вашем случае будет:

std::uint32_t size;
size_t len = read(m_socket, buffer(&size, sizeof(std::uint32_t)));