Книга: UNIX: разработка сетевых приложений
16.3. Неблокируемая функция connect
16.3. Неблокируемая функция connect
Когда сокет TCP устанавливается как неблокируемый, а затем вызывается функция connect
, она немедленно возвращает ошибку EINPROGRESS
, однако трехэтапное рукопожатие TCP продолжается. Далее мы с помощью функции select
проверяем, успешно или нет завершилось установление соединения. Неблокируемая функция connect находит применение в трех случаях:
1. Трехэтапное рукопожатие может наложиться на какой-либо другой процесс. Для выполнения функции connect
требуется один период обращения RTT (см. раздел 2.5), и это может занять от нескольких миллисекунд в локальной сети до сотен миллисекунд или нескольких секунд в глобальной сети. Это время мы можем провести с пользой, выполняя какой-либо другой процесс.
2. Мы можем установить множество соединений одновременно, используя эту технологию. Этот способ уже стал популярен в применении к веб-браузерам, и такой пример мы приводим в разделе 16.5.
3. Поскольку мы ждем завершения установления соединения с помощью функции select
, мы можем задать предел времени для функции select
, что позволит нам сократить тайм-аут для функции connect
. Во многих реализациях тайм-аут функции connect лежит в пределах от 75 с до нескольких минут. Бывают случаи, когда приложению нужен более короткий тайм-аут, и одним из решений может стать использование неблокируемой функции connect
. В разделе 14.2 рассматриваются другие способы помещения тайм-аута в операции с сокетами.
Как бы просто ни выглядела неблокируемая функция connect
, есть ряд моментов, которые следует учитывать.
? Даже если сокет является неблокируемым, то когда сервер, с которым мы соединяемся, находится на том же узле, обычно установление соединения происходит немедленно при вызове функции connect
.
? В Беркли-реализациях (а также POSIX) имеются два следующих правила, относящихся к функции select
и неблокируемой функции connect
: во-первых, когда соединение устанавливается успешно, дескриптор становится готовым для записи [128, с. 531], и во-вторых, когда при установлении соединения встречается ошибка, дескриптор становится готовым как для чтения, так и для записи [128, с. 530].
ПРИМЕЧАНИЕ
Эти два правила в отношении функции select выпадают из общего ряда наших правил из раздела 6.3 относительно условий, при которых дескриптор становится готовым для чтения или записи. В сокет TCP можно записывать, если достаточно места в буфере отправки (что всегда будет выполнено в случае присоединенного сокета, поскольку мы еще ничего не записали в сокет) и сокет является присоединенным (что выполняется, только когда завершено трехэтапное рукопожатие). При наличии ошибки, ожидающей обработки, появляется возможность читать из сокета и записывать в сокет.
С неблокируемыми функциями connect
связано множество проблем переносимости, которые мы отметим в последующих примерах.
- 16.4. Неблокируемая функция connect: клиент времени и даты
- 16.5. Неблокируемая функция connect: веб-клиент
- 16.6. Неблокируемая функция accept
- 4.3. Функция connect
- 2.1.3. Функция getopt_long()
- Системные переменные ROWS_AFFECTED, GDSCODE, SQLCODE, TRANSACTIONJD, CONNECTIONJD
- Группировка по встроенным функциям и UDF
- 19.1.1. Функция jQuery()
- CONNECTION TIMEOUT
- TCP connections
- UDP connections
- ICMP connections