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