Если вы уверены, что ничто на вашей стороне TCP-соединения не закрывает соединение, то мне кажется, что удаленная сторона закрывает соединение.
ENOTCONN
, как уже отмечали другие, просто означает, что розетка не подключена. Это не обязательно означает, что connect
не удалось. Возможно, сокет был подключен ранее, но не во время вызова, в результате которого ENOTCONN
.
Это отличается от:
ECONNRESET
: другой конец соединения отправил пакет сброса TCP. Это может произойти, если другой конец отказывает в соединении или не признает, что оно уже подключено, среди прочего.
ETIMEDOUT
: это обычно относится только к connect
. Это может произойти, если попытка подключения не удалась в течение системно-зависимого промежутка времени.
EPIPE
иногда может возвращаться некоторыми системными вызовами, связанными с сокетом, в условиях, которые более или менее совпадают с ENOTCONN
. Например, в некоторых системах EPIPE
и ENOTCONN
являются синонимами, когда возвращаются send
.
Хотя для shutdown
не является необычным возвращение ENOTCONN
, поскольку предполагается, что эта функция разрывает TCP-соединение, я был бы удивлен, увидев close
return ENOTCONN
. Это действительно никогда не должно делать это.
Наконец, как упоминалось в dwc, EBADF
не должно применяться в вашем сценарии, если вы не пытаетесь выполнить какую-либо операцию с файловым дескриптором, который уже был close
d. Отключение сокета (т. Е. Разрыв соединения TCP) - это не то же самое, что закрытие дескриптора файла, связанного с этим сокетом.