Сценарий:
У меня есть клиент и сервер, написанные с использованием 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
, как мне узнать, что мой партнер больше не отвечает?