Есть много вещей, которые вы можете проверить, но ни один из них не гарантирует, что даст вам результат, который вы ищете. Даже реализация на сервере не будет работать 100% времени. Я гарантирую, что однажды он потерпит неудачу.
Существуют пакеты FIN, которые следует отправлять от клиента к серверу, и наоборот, когда соединение закрыто, но нет гарантии, что они будут доставлены, или даже обработано.
Это обычно называется проблемой Half Half Open .
Закрытие сокета TCP является взаимосогласованным процессом, обычно у вас есть протокол обмена сообщениями, который сообщает другому концу, что он закрывается, или у вас есть какой-то предопределенный набор инструкций, и после этого вы закрываете.
Единственный надежный способ 100% -ного обнаружения, если удаленный сокет закрыт, - это отправить ему некоторые данные. Только если вы получите сообщение об ошибке, вы узнаете, закрылся ли сокет.
Некоторые приложения, которые не отправляют большое количество данных, реализуют протокол поддержки активности, они просто отправляют / получают несколько байтов каждую минуту поэтому они знают, что удаленная конечная точка присутствует.
Технически вы можете иметь два сервера, которые находятся в подключенном состоянии и не отправляли данные друг другу в течение 10 лет. Каждый конец продолжает полагать, что другой конец существует, пока одна попытка не отправит некоторые данные и не обнаружит, что это не так.