| Предыдущий | Следующий |
| EOVERFLOW | EOWNERDEAD |
EISCONN
Конечная точка уже имеет состояние соединения
EISCONN относится к состоянию сокета, а не достижимости. Solaris описывает два важных случая: повторный запрос connect для уже подключённой конечной точки либо sendto()/sendmsg() передаёт назначение для конечной точки, соединение которой уже определяет удалённый узел.
Это отличается от EALREADY, где неблокирующая операция всё ещё выполняется, и от ENOTCONN, где операция, требующая соединения, не имеет установленного узла. Поэтому проверка перехода состояния и точного вызова API полезнее проверки маршрутизаторов или политики брандмауэра.
Что проверять в коде сокетов
- Трассируйте создание сокета, каждый успешный или ожидающий
connect()и любое повторное использование дескриптора после пула соединений. - Для отправки дейтаграмм или сообщений проверьте, подключило ли приложение сокет намеренно; подключённый сокет может использовать операции send без указания назначения при каждой отправке.
- В многопоточном коде установите, какой поток изменил состояние сокета до ошибочного вызова.
Ссылки
- Oracle Solaris: каталог errno intro(2)
- POSIX: условия ошибок connect()
- POSIX: назначение sendto() и семантика соединения
Нужно найти другой код? Найти другой код состояния или ошибки.