| Предыдущий | Следующий |
| ENAMETOOLONG | EIDRM |
EINPROGRESS
Ожидающая операция, а не завершённое соединение
EINPROGRESS — ожидаемый промежуточный результат, когда неблокирующая операция с сокетом не может завершиться немедленно. Для попытки подключения он означает, что ядро приняло запрос и сокет всё ещё проходит установление соединения; код не означает, что другая сторона приняла соединение.
Рассматривайте этот результат как переход состояния. Повторение connect() в тесном цикле может заменить полезные данные кодом EALREADY или скрыть окончательный результат. Дождитесь механизма готовности, используемого приложением, затем прочитайте ожидающую ошибку сокета через getsockopt(..., SO_ERROR, ...) и только после этого объявляйте успех.
Что сохранить для диагностики
- Сохраните семейство адресов, тип сокета, протокол, признак неблокирующего режима, локальный и удалённый адреса и момент начала попытки.
- Запишите событие готовности и последующее значение
SO_ERROR. Сама по себе доступность для записи не доказывает успех неблокирующего подключения. - Не смешивайте срок ожидания соединения с состоянием ядра: тайм-аут приложения может отменить всё ещё ожидающую попытку, не доказывая, что сеть её отклонила.
Не путайте с другими кодами
EALREADY означает, что на том же объекте уже ожидает другая операция; EISCONN означает, что у сокета уже есть подключённая другая сторона. Из этих трёх кодов только EINPROGRESS обычно описывает первое наблюдаемое ожидающее состояние.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.