Используя boost :: asio :: tcp, как получить уведомление при разрыве сокета - PullRequest
0 голосов
/ 01 ноября 2019

Сценарий:
Я использую протокол 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 слишком велико. Я получаю уведомление даже через много минут после того, как произошел сбой пира.

...