В TCP есть только один способ обнаружить упорядоченное разъединение, то есть получить ноль в качестве возвращаемого значения от read()/recv()/recvXXX()
при чтении.
Существует также только один надежный способ обнаружения разорванного соединения: запись в него. После достаточного количества записей в разорванное соединение TCP выполнит достаточно попыток и тайм-аутов, чтобы узнать, что оно разорвано, и в конечном итоге write()/send()/sendXXX()
вернет -1 со значением errno/WSAGetLastError()
ECONNRESET,
или в некоторых случаях истекло время ожидания соединения ». Обратите внимание, что последний отличается от «тайм-аута соединения», который может возникнуть в фазе соединения.
Вы также должны установить разумное время ожидания для чтения и отбросить соединения, которые его терпят неудачу.
Ответ здесь о ioctl()
и FIONREAD
- полная ерунда. Все, что он делает, это говорит вам, сколько байтов в настоящее время находится в буфере приема сокета, доступном для чтения без блокировки. Если клиент не отправляет вам в течение пяти минут ничего, что не является разъединением, но приводит к тому, что FIONREAD
будет равно нулю. Не то же самое: даже близко.