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