В чем разница между asio:: tcp::async_read_some сокета и async_receive?
-
19-09-2019 - |
Вопрос
В чем разница между:
boost::asio::tcp::socket::async_read_some()
boost::asio::tcp::socket::async_receive()
Насколько я могу судить, их документация идентична.
Что мне следует предпочесть?
Решение
Их спецификация в сетевое предложение TR2 (5.7.10.2 члены basic_stream_socket) тоже идентичны:
В async_receive:
Эффекты:Вызывает this->service.async_receive(это-> реализация, буферы, 0, обработчик).
В async_read_some:
Эффекты:Вызывает this->service.async_receive(это-> реализация, буферы, 0, обработчик).
Так что, я думаю, это подтверждает впечатление Джерри.
Другие советы
Я считаю, что эти два понятия по сути идентичны.Причина, по которой они предоставляют оба, заключается в предоставлении интерфейсов, похожих на оба iostreams (которые имеют read_some
элемент) и сокеты (которые имеют receive
).
Как отметил Питер Ценг, async_receive
также имеет перегрузку, которая принимает socket_base::message_flags
, который async_read_some
не делает этого.
Подтверждаю всех присутствующих здесь двумя ссылками:
- https://github.com/boostorg/asio/blob/36eef63a9cf8ae609716d76ccb3906ff9769d53a/include/boost/asio/basic_stream_socket.hpp#L558
- https://github.com/boostorg/asio/blob/36eef63a9cf8ae609716d76ccb3906ff9769d53a/include/boost/asio/basic_stream_socket.hpp#L834
Код в точности такой же.Однако async_receive
имеет одну перегрузку с помощью message_flags, которая, в частности, позволяет вам указать asio::socket_base::message_peek
.