Функции приема/отправки сокета boost.asio плохие?

Данные могут быть прочитаны или записаны в подключенный TCP-сокет с помощью функций-членов receive(), async_receive(), send() или async_send(). Однако, поскольку это может привести к коротким операциям записи или чтения, приложение обычно вместо этого использует следующие операции: read(), async_read(), write() и async_write().

Я не очень понимаю это замечание, поскольку read(), async_read(), write() и async_write() также могут заканчиваться короткими операциями записи или чтения, верно?
Почему эти функции не совпадают?
Должен ли я вообще их использовать?
Кто-нибудь может пояснить мне это замечание?


person the_drow    schedule 18.05.2010    source источник


Ответы (2)


read, async_read, write и async_write — это композитные функции, которые вызывают class функционирует несколько раз, пока запрошенное количество байтов не будет передано. Они включены библиотекой для удобства. В противном случае каждому разработчику пришлось бы реализовывать одну и ту же логику.

Функции класса напрямую обертывают базовые функции ОС, что в основном указано в документации: эти функции могут возвращаться до того, как все байты будут переданы.

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

person Dan    schedule 19.05.2010
comment
Почему это было разработано таким образом? В каком случае вам не нужно получать все запрошенные байты? Почему объект сокета не включает чтение/запись/async_read/async_write? Вы все равно передаете сокет. - person the_drow; 19.05.2010
comment
Я не знаю почему, но вы, вероятно, можете найти ответ в Предложении сетевой библиотеки для TR2. open-std.org/jtc1/sc22/ wg21/docs/papers/2006/n2054.pdf - person Dan; 20.05.2010
comment
Что касается ранее связанного документа, посмотрите на стр. 8. - person Dan; 20.05.2010

Прежде всего, вы должны понимать слово «асинхронный», оно просто означает «не нужно ждать». После вызова асинхронных действий следующее действие будет выполняться не дожидаясь возврата асинхронного действия. В то время как синхронные должны ждать, пока не вернутся предыдущие синхронные действия. Два следующих примера из Boost.Asio имеют смысл: Синхронный TCP-сервер дневного времени

(Ой! Недостаточно репутации, второй образец легко найти, он называется "Асинхронный дневной TCP-сервер")

person Community    schedule 19.05.2010
comment
Как это связано с моим вопросом? - person the_drow; 19.05.2010
comment
извините.... я предполагаю, что первый абзац в вашем вопросе был цитатой... поэтому я их игнорирую..... - person rhapsodyn; 20.05.2010