Сценарий:
Я использую протокол boost :: asio :: tcp между двумя узлами, подключенными по сети. Мой код работает на Linux, macOS и iOS.
У меня есть механизм пинг-понга Watchdog, реализованный с обеих сторон, чтобы проверить, что соединение между сокетами в порядке между узлами. Это делается путем отправки фиктивного пакета каждые 2 секунды, который, я думаю, является известным подходом.
Задача:
Но есть ли способ, которым я могу избежать написания этого сторожевого таймера самостоятельно? Есть ли способ включить сам стек asio / TCP, чтобы сделать это для меня и вызвать событие правильно, когда соединение с сокетом не в порядке? Я пытался понять функциональность kepp_alive в стеке TCP, потому что, кажется, у него есть ответ на мой вопрос?
Но, опять же, похоже, что я могу настроить параметры keep_alive
, но boost::asio::tcp
, похоже, не дает мне API для этого.
Вопрос:
Поможет ли настройка параметров keep_alive мне достичь своей цели? Моя цель - получить уведомление от стека asio или TCP, когда сокет больше не подключен из-за каких-либо странных причин на стороне партнера. Обратите внимание, что одноранговый узел может работать странным образом, например, из-за паники ядра или чего-то действительно сумасшедшего.
Просто установка socket.set_option(boost::asio::socket_base::keep_alive(true));
, похоже, не помогает. Время по умолчанию в Linux слишком велико. Я получаю уведомление даже через много минут после того, как произошел сбой пира.