Что такое Async Sockets? Чем они отличаются от обычных сокетов (блокировка и неблокирование)?
Любые указатели в этом направлении или любые ссылки на учебные пособия будут полезны.
Спасибо.
Что такое Async Sockets? Чем они отличаются от обычных сокетов (блокировка и неблокирование)?
Любые указатели в этом направлении или любые ссылки на учебные пособия будут полезны.
Спасибо.
Существует три способа связи с сокетами с помощью async:
Откройте обычный сокет, но не читайте его (потому что read()
блокирует), пока не узнаете, что он что-то читается. Вы можете использовать select()
или poll()
, чтобы проверить, есть ли данные для чтения из сокетов (ы), и если что-то есть, прочитайте его, поскольку read()
не будет блокироваться.
Переключите сокет на неблокирующий ввод-вывод, установив флаг O_NONBLOCK
с помощью функции fcntl()
. В этом случае read()
не будет блокироваться.
Установите флаг сокета O_ASYNC
, используя опцию FIOASYNC
ioctl()
(подробнее см. man 7 socket
). В этом случае вы получите сигнал SIGIO
, когда есть что-то прочитать из сокета.
Третий подход - это асинхронный сокет.
Сравнение следующих пяти разных моделей для ввода/вывода в Сетевое программирование UNIX: интерфейс сетевых сокетов был бы полезен:
Блокировка
неблокирования
Мультиплексирование ввода/вывода
Ввод-вывод с сигнальным управлением
Асинхронный ввод/вывод
Если сервер использует синхронный сокет, в то время как он ожидает данных от клиента, его основной поток блокируется, поэтому сервер ничего не сделает... это плохо, если у вас есть несколько клиентов, подключающихся. В асинхронном сокете вы можете делать другие вещи, ожидая, пока клиент отправит вам данные, поэтому теперь у вас может быть несколько клиентов, подключающихся к вам.
Синхронный использует функцию типа receive(), которая блокирует, пока не получит сообщение
Асинхронный имеет beginReceive() endReceive() или подобные функции. Он использует обратные вызовы, когда сообщение получено, обратный вызов вызывается