| Предыдущий | Следующий |
| ENOLCK | ECHRNG |
EALREADY
У сокета уже есть незавершённый запрос
EALREADY — результат, связанный с параллельностью и управлением состоянием. Он часто возникает, когда код снова вызывает connect() после того, как неблокирующая попытка соединения уже вернула EINPROGRESS. Второй вызов не создаёт отдельную независимую попытку соединения.
Полезно выяснить не общую доступность назначения, а какая часть программы всё ещё владеет незавершённой операцией этого сокета. Таймер повторной попытки, путь отмены и обратный вызов цикла событий не должны одновременно выполнять новый connect() для одного дескриптора.
Как безопасно разрешить состояние
- Свяжите с файловым дескриптором одну явную запись состояния соединения и разрешите только её владельцу обрабатывать события готовности и тайм-аута.
- После появления готовности один раз запросите
SO_ERRORи переведите соединение в состояние «подключено», «ошибка» или «закрыто»; не делайте вывод об успехе только по уведомлению о событии. - Если срок ожидания истёк, закройте или иным способом выведите из использования незавершённый сокет до начала новой попытки. Повторное использование дескриптора с неоднозначным состоянием затрудняет отнесение последующих ошибок к их причинам.
Соседние ошибки имеют другое значение
EINPROGRESS описывает первый результат незавершённой операции. EISCONN сообщает о завершённом подключённом состоянии. ECONNREFUSED, ETIMEDOUT и EHOSTUNREACH — окончательные результаты, которые могут быть обнаружены только после завершения ожидающей попытки.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.