Нет способа обнаружить, что TCP-соединение не работает "КАК МОЖНО СКОРЕЕ".Если хост на другой стороне не работает, он больше не участвует в диалоге TCP-соединения, и единственный способ заметить, что это тайм-аут соединения.
Вы можете уменьшить время активности активности на сокете до«заметить» проблему раньше, но это не очень хорошее решение в целом.
Если вы пытаетесь контролировать хост, отправляйте короткие сообщения «ping» с любой частотой, которая вам подходит.Если другая сторона не отвечает в течение заданного интервала, вы можете объявить его «мертвым».
Как только вы заметили обрыв соединения, закрытие сокета достаточно, чтобы освободить все ресурсы ядра, связанные с этим сокетом..
Если у вас есть другие ресурсы, выделенные рядом с ними (например, информация о сеансе), вам также необходимо освободить их.Это действительно хорошая идея написать функцию для этого (и для распределения этих ресурсов, когда вы устанавливаете соединение), так что весь этот бухгалтерский учет находится в одном месте и его легко проверить.
Как вы хранитеОтслеживание выделенных ресурсов полностью зависит от вас.Удержание ссылки на все «подлежащие освобождению» ресурсы в одном struct
и сохранение этой структуры в связанном списке или хеше (например, проиндексированном сокетом fd) могут сработать очень хорошо.
(Термин «сторожевой таймер» в любом случае в Linux используется для аппаратного мониторинга устройств. Это не очень хороший термин для поиска вещей, связанных с сетью / TCP.)