| Предыдущий | Следующий |
| EHOSTUNREACH | EINPROGRESS |
EALREADY
Вторая операция поступила, пока первая ещё выполняется
EALREADY является ошибкой состояния неблокирующей операции. Solaris сообщает, что на неблокирующем объекте была предпринята операция, когда другая операция уже выполнялась. POSIX connect() использует этот errno именно тогда, когда запрос подключения для сокета уже находится в процессе выполнения.
Это последующее отличие от EINPROGRESS. Первый неблокирующий connect может вернуть EINPROGRESS , поскольку установление подключения началось асинхронно; повторный вызов connect() до завершения этой попытки может вернуть EALREADY.
Правильная последовательность неблокирующего connect
- После
EINPROGRESS, зарегистрируйте сокет в механизме ожидания готовности приложения вместо немедленного повторного вызова connect. - После сообщения о готовности используйте документированную платформой проверку завершения и сохраните итоговую ошибку сокета.
- Проверьте владение состоянием в событийном коде, чтобы два рабочих потока не могли независимо начать одну и ту же попытку подключения.
Ссылки
- Oracle Solaris: каталог errno intro(2)
- POSIX: условия ошибок connect()
- POSIX: правила domain, type и protocol для socket()
Нужно найти другой код? Найти другой код состояния или ошибки.