Что означает код errno 38 (ENOTSOCK)?

 
Также может означать:
КонстантаТипОС
ERROR_HANDLE_EOFОшибка WindowsWindows
KERN_LOCK_SET_DESTROYEDКод возврата ядра macOSmacOS
ippStsSymKernelExpectedСтатус Intel IPPЛюбая
ENOSYSerrnoLinux
EL2NSYNCerrnoSolaris
ENAMETOOLONGerrnoWindows
CDFS_FILE_SYSTEMКод BSODWindows
Предыдущий Следующий
ENOSYS EL2NSYNC

ENOTSOCK

Дескриптор допустим только как число

ENOTSOCK означает, что аргумент, переданный API сокетов, не указывает на объект сокета. Это не ошибка сетевой доступности, и она не определяет удалённую конечную точку. Сбой локально связан с владением дескриптором, его временем жизни или выбором API.

Распространённая диагностическая ловушка — записывать только числовой дескриптор. После закрытия одним потоком ядро может повторно использовать то же число для несвязанного файла. Отложенный обратный вызов затем выполнит send(), connect() или shutdown() для неправильного объекта и получит ENOTSOCK.

Какие данные собрать

  • Записывайте создание дескриптора, dup(), передачу, закрытие и владение обратным вызовом вместе с монотонно возрастающим идентификатором соединения, а не только числом дескриптора.
  • Сохраните точный системный вызов и значение дескриптора. Например, shutdown() явно отличает дескриптор не-сокета от неподключённого сокета.
  • Проверьте, что отмена или разборка не оставляет задачу в очереди с устаревшим дескриптором после уничтожения объекта соединения.

Почему повторное подключение не устраняет ошибку

Создание нового сетевого соединения может временно скрыть гонку, но не исправит вызов, использовавший дескриптор не-сокета. Дефект находится в локальном владении ресурсом или в выборе API сокетов для файлового дескриптора другого вида.

Ссылки


Нужно найти другой код? Найти другой код состояния или ошибки.