Как использовать свойство TCP keep_alive, чтобы получать уведомления о событии не отвечающего на запрос партнера? - PullRequest
0 голосов
/ 04 ноября 2019

Сценарий:
У меня есть клиент и сервер, написанные с использованием boost :: asio 1.63 . Как правило, часть соединения и связи работает хорошо и отлично.

Я написал Сторожевой таймер с обеих сторон, который отправляет фиктивные пакеты одноранговым узлам с интервалом в 2 секунды каждый. Целью сторожевого таймера является то, что заинтересованный узел сообщает об ошибке соединения, если он не получает фиктивный пакет, который он ожидает в течение следующих 2 секунд. Это даже более важно для меня, потому что может случиться, что 2 одноранговых узла не выполняют транзакции для каких-либо пользовательских целей, но каждый из них обязан сообщать об ошибке соединения, если какой-либо из одноранговых узлов выходит из строя. Одноранговый узел может выйти из строя даже из-за сбоя ядра, и в этом случае этот узел не сможет отправить сообщение. Конечно, это классическая проблема, которая существует даже за пределами asio и TCP.

My Watchdog работает превосходно. Никаких проблем.

Но , недавно я прочитал о функции keep_alive в сокетах. Я опробовал следующий код, и мне кажется, что я могу использовать свойство keep_alive для сокета TCP, передавая собственный дескриптор сокета из моего кода, используя boost::asio.

boost::asio::io_service      ioService;
boost::asio::ip::tcp::socket mySocket(ioService);

int on = 1;
int delay = 120;
setsockopt(mySocket.native_handle(), SOL_SOCKET, SO_KEEPALIVE, &on, sizeof(on));
setsockopt(mySocket.native_handle(), IPPROTO_TCP, TCP_KEEPALIVE, &delay, sizeof(delay));

Вопрос:
Приведенный выше код хорошо компилируется на macOS, Linux и iOS. Это выглядит великолепно. Но как мне извлечь выгоду из этого? Дает ли это мне обратный вызов или событие, когда партнер отключается? Освобождает ли это меня от написания сторожевого таймера, который я описал выше?

Я использовал boost::asio::async_connect для подключения к пиру. Могу ли я получить обратный вызов для моего connectionHandler, когда perr отключается после определенного интервала времени ожидания?

Установив параметры keep_alive, как мне узнать, что мой партнер больше не отвечает?

1 Ответ

0 голосов
/ 13 ноября 2019

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

Проблема в том, что опция TCP keep_alive нене всегда обнаруживает разъединения.

Как правило, не существует надежного способа обнаружения внезапного разъединения, кроме как с помощью ping / heartbeat уровня приложения.

Вы также можете увидеть эту тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...