Функции приема / отправки сокета boost.asio плохие? - PullRequest
7 голосов
/ 19 мая 2010

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

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

Ответы [ 2 ]

6 голосов
/ 19 мая 2010

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

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

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

0 голосов
/ 19 мая 2010

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

(Упс! Репутации недостаточно, хотя второй пример легко найти, он называется «Асинхронный сервер TCP для дневного времени»)

...