Такое увеличение размеров и повышение сложности кода обычно происходит при переходе от блокирующей, многопоточной или многозадачной архитектуры к неблокирующему однопоточному проекту.
Неблокирующие операции подключения и приема входящих соединений.
В остальной части описания рассматриваются неблокирующие операции подключения и приема входящих соединений. Кроме операций чтения и записи, сокеты могут блокироваться также при вызове функции connect (), когда удаленный хост не спешит с ответом, и функции accept () во время ожидания входящих соединений.
Функция connect () может заблокироваться на неопределенное время при многих обстоятельствах, но чаще всего это происходит, когда удаленный хост остановлен или неисправный маршрутизатор исключает к нему доступ. В этих случаях функция connect () блокируется на неопределенно долгое время, пока ошибка не будет исправлена. Реже встречается еще одна ситуация, при которой на удаленный сервер поступает слишком большое число входящих запросов и он не сразу вызывает функцию accept (). В обоих случаях можно использовать неблокирующий вызов connect () для установки предельного значения времени, на которое будет заблокирована функция connect (). Кроме того, можно одновременно инициализировать несколько операций подключения и обрабатывать результаты каждой из них по мере их завершения. Функция accept () обычно применяется с серверами, ожидающими входящих соединений, в блокирующем режиме.