| Предыдущий | Следующий |
| EDEADLOCK | EOWNERDEAD |
ESHUTDOWN
Приложение закрыло это направление соединения
ESHUTDOWN означает, что операция отправки была предпринята после того, как сокет уже отключили для отправки. shutdown() изменяет разрешённые направления приёма и передачи, не закрывая сам файловый дескриптор, поэтому действующий дескриптор не означает, что оба направления по-прежнему доступны.
Это локальная ошибка жизненного цикла. Её следует отличать от корректного удалённого закрытия, влияющего на приём, и от сброса, который удаляет состояние соединения, а не намеренно отключает выбранное направление.
Как сделать переход наблюдаемым
- Запишите вызов
shutdown(), его значениеhow, идентификатор соединения и все ожидавшие записи, существовавшие в тот момент. - Заставьте писателей видеть тот же переход состояния до постановки данных в очередь. Иначе более поздний рабочий поток может сообщить
ESHUTDOWNспустя долгое время после исчезновения видимой причины закрытия. - Сохраняйте семантическое различие
close()иshutdown()в журналах: после успешного shutdown файловый дескриптор POSIX остаётся открытым.
Восстановление зависит от семантики протокола
Открытие нового соединения может быть уместным, но не сделает старый сокет снова доступным для записи. Сначала определите, были ли данные в очереди намеренно отброшены, полностью переданы или требуют правила воспроизведения на уровне приложения.
Ссылки
Нужно найти другой код? Найти другой код состояния или ошибки.
