Питання Що таке Async Sockets?


Що таке Async Sockets? Як вони відрізняються від звичайних розеток (блокування та блокування)?

Будь-які вказівки в цьому напрямку або будь-які посилання на навчальні посібники будуть корисними.

Дякую.


22
2018-02-25 05:35


походження




Відповіді:


Існує три способи спілкування з сокетами за допомогою асинхронного способом:

  1. Відкрийте звичайний роз'єм, але не читайте з нього (тому що read() блоки), поки ви не знаєте там щось для читання. Ви можете використовувати select() або poll() щоб перевірити, чи є дані для читання з гнізда (ів), і якщо є щось, прочитайте його, як read() не заблокує

  2. Перемкніть сокет на неблокуючий ввід / вихід, налаштувавши O_NONBLOCK прапор з fcntl() функція В цьому випадку read() не заблокує

  3. Встановити гніздо O_ASYNC прапор використовує FIOASYNC опція ioctl() (побачити man 7 socket для подробиць). У цьому випадку ви отримаєте SIGIO сигнал, коли щось прочитати з гнізда.

Третій підхід - асинхронний сокет.


26
2018-02-25 07:15



Також існують, ймовірно, інші платформи, специфічні способи використання анінхронних розеток, такі як використання портів завершення входу / виходу та введення-виведення на платформах Windows. - Len Holgate
@ Лін Звичайно. Навіть це не крос-платформенне, як fcntl() може мати різні варіанти на різних платформах, і ioctl() не стандартна і дуже залежна від платформи. - qrdl
Чи є платформа незалежним варіантом? - Juan


Порівняння наступних п'яти різних моделей для введення / виводу в Програмне забезпечення мережі UNIX: мережевий API сокетів було б корисно:

Блокування

Неблокірування

Мультиплексування вводу-виводу

Сигнал-керований вхід / вихід

Асинхронний ввід / вивід


4
2018-02-25 10:49





Якщо сервер використовує синхронний сокет, поки він чекає даних від клієнта, його основний потік заблоковано, так що сервер не буде нічого робити ... це погано, якщо у вас є кілька підключених клієнтів. У асинхронному сокеті ви можете робити інші речі, очікуючи, що клієнт відправить вам дані, тому тепер ви можете мати кілька клієнтів, які з'єднаються з вами

Синхронно використовує таку функцію, як receive (), яка блокує до отримання повідомлення

Асинхронний має розпочати отримання () endReceive () або подібних функцій. Він використовує зворотні виклики, коли одержує повідомлення, викликається зворотний виклик


2
2018-02-25 05:41