В моей версии Linux и glibc я могу вызывать shutdown
несколько раз на одном и том же открытом сокете.Он будет счастливо возвращать 0 до тех пор, пока сокет не будет фактически разрушен в этом направлении, а затем вернет -1 с помощью errno == ENOTCONN
.Он не вернет EBADF
, пока вы не close
FD, и тогда вам все равно не следует использовать этот FD.
Этот факт на самом деле довольно полезен, поскольку вы можете вызывать shutdown в цикле по порядку.обнаружить, что соединение было разорвано так или иначе.epoll
Обнаружение ошибок в сокете, похоже, разбудит его в нужное время.