Как написать простой таймер WatchDog в C на Linux? - PullRequest
3 голосов
/ 21 мая 2011

Таймер TCP KEEPALIVE по умолчанию имеет длительность 2 часа.
Как лучше всего знать, что TCP-соединение / сокет не работает -

  • Является ли внедрение таймера WatchDog лучшим способом?

  • Как мне реализовать таймер WatchDog, чтобы сделать это?
    Я просматривал довольно широко (возможно, я использую неправильные параметры поиска), но я не видел ни одноготакую ​​реализацию для linux GPOS, я вижу только аппаратный встроенный системный таймер, который зависит от аппаратного обеспечения.

Обычно, что вы делаете после обнаружения, еслисокет / соединение оборвалось.

  • Вы только закрываете socket_descriptor?
  • Освобождает ли закрытие socket_descriptor все ресурсы ядра, связанные с этим соединением?
  • Как освободить все ресурсы, связанные / выделенные в пространстве пользователя?Ты пишешь рутину, чтобы делать.Если да, как вы отслеживаете ресурсы, которые вы выделяете в пространстве пользователя?

1 Ответ

4 голосов
/ 21 мая 2011

Нет способа обнаружить, что TCP-соединение не работает "КАК МОЖНО СКОРЕЕ".Если хост на другой стороне не работает, он больше не участвует в диалоге TCP-соединения, и единственный способ заметить, что это тайм-аут соединения.

Вы можете уменьшить время активности активности на сокете до«заметить» проблему раньше, но это не очень хорошее решение в целом.

Если вы пытаетесь контролировать хост, отправляйте короткие сообщения «ping» с любой частотой, которая вам подходит.Если другая сторона не отвечает в течение заданного интервала, вы можете объявить его «мертвым».

Как только вы заметили обрыв соединения, закрытие сокета достаточно, чтобы освободить все ресурсы ядра, связанные с этим сокетом..

Если у вас есть другие ресурсы, выделенные рядом с ними (например, информация о сеансе), вам также необходимо освободить их.Это действительно хорошая идея написать функцию для этого (и для распределения этих ресурсов, когда вы устанавливаете соединение), так что весь этот бухгалтерский учет находится в одном месте и его легко проверить.

Как вы хранитеОтслеживание выделенных ресурсов полностью зависит от вас.Удержание ссылки на все «подлежащие освобождению» ресурсы в одном struct и сохранение этой структуры в связанном списке или хеше (например, проиндексированном сокетом fd) могут сработать очень хорошо.

(Термин «сторожевой таймер» в любом случае в Linux используется для аппаратного мониторинга устройств. Это не очень хороший термин для поиска вещей, связанных с сетью / TCP.)

...