| Предыдущий | Следующий |
| ENOSYS | EL2NSYNC |
ENOTSOCK
Дескриптор допустим только как число
ENOTSOCK означает, что аргумент, переданный API сокетов, не указывает на объект сокета. Это не ошибка сетевой доступности, и она не определяет удалённую конечную точку. Сбой локально связан с владением дескриптором, его временем жизни или выбором API.
Распространённая диагностическая ловушка — записывать только числовой дескриптор. После закрытия одним потоком ядро может повторно использовать то же число для несвязанного файла. Отложенный обратный вызов затем выполнит send(), connect() или shutdown() для неправильного объекта и получит ENOTSOCK.
Какие данные собрать
- Записывайте создание дескриптора,
dup(), передачу, закрытие и владение обратным вызовом вместе с монотонно возрастающим идентификатором соединения, а не только числом дескриптора. - Сохраните точный системный вызов и значение дескриптора. Например,
shutdown()явно отличает дескриптор не-сокета от неподключённого сокета. - Проверьте, что отмена или разборка не оставляет задачу в очереди с устаревшим дескриптором после уничтожения объекта соединения.
Почему повторное подключение не устраняет ошибку
Создание нового сетевого соединения может временно скрыть гонку, но не исправит вызов, использовавший дескриптор не-сокета. Дефект находится в локальном владении ресурсом или в выборе API сокетов для файлового дескриптора другого вида.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.
