Czym są gniazda asynchroniczne?

Co to są gniazda asynchroniczne? Czym różnią się od zwykłych gniazd (blokujących i nieblokujących)?

Wszelkie wskazówki w tym kierunku lub linki do tutoriali będą pomocne.

Dzięki.
Author: Jay, 2010-02-25

3 answers

Istnieją trzy sposoby komunikacji z gniazdami w asynchroniczny sposób:

  1. Otwórz zwykłe gniazdo, ale nie czytaj z niego (ponieważ read() blokuje), dopóki nie wiesz, że tam jest coś do odczytania. Możesz użyć select() lub poll(), aby sprawdzić, czy są dane do odczytu z gniazd,a jeśli coś jest, przeczytaj to, ponieważ read() nie zablokuje.

  2. Przełącz gniazdo na nieblokujące We/Wy, ustawiając znacznik O_NONBLOCK z funkcją fcntl(). W tym przypadku read() nie blok.

  3. Ustawia flagę gniazda O_ASYNC używając opcji FIOASYNC z ioctl() (szczegóły w sekcji Man 7 socket). W tym przypadku otrzymasz SIGIO sygnał, gdy jest coś do odczytania z gniazda.

Trzecie podejście to gniazdo asynchroniczne.

 30
Author: qrdl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-22 18:36:06

Porównanie następujących pięciu różnych modeli We / Wy w programowania sieci UNIX: API sieci socketów byłoby pomocne:

Blokowanie

Nonblocking

Multipleksowanie We/Wy

Signal-driven I / O

Asynchroniczne We/Wy

 3
Author: Andy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 10:49:35

Jeśli serwer korzysta z gniazda synchronicznego, podczas gdy oczekuje na dane od klienta, jego główny wątek jest zablokowany, więc serwer nie będzie nic robił... jest to złe, jeśli masz wielu klientów łączących. W gniazdku asynchronicznym możesz wykonywać inne czynności czekając na wysłanie danych przez klienta, więc teraz możesz mieć wielu klientów łączących się z tobą

Synchronous używa funkcji takiej jak receive (), która blokuje dopóki nie otrzyma wiadomości

Asynchroniczny ma beginReceive () endReceive () lub podobne funkcje. Używa wywołań zwrotnych, gdy wiadomość jest odbierana, wywołanie zwrotne jest wywoływane

 2
Author: Warty,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-25 05:41:10