Keepalive был разработан для работы с так называемыми полуоткрытыми соединениями, когда одна из сторон (обычно сервер, который получает запросы) не знает, что соединение было разорвано. Клиент обычно знает об этом, потому что попытка отправить запрос на сервер вернет вам ошибку.
Другой вариант - сохранить работу прослушивателя - когда клиент обнаруживает проблемы со связью, он просто пытается снова подключиться к серверу. Сервер получает входящее соединение, проверяет его с того же IP-адреса и, если это так, закрывает открытое соединение и устанавливает новое.
Но если клиент не знает, что соединение разорвано, и серверу нужно что-то отправить, сервер не сможет восстановить соединение, кроме TCP-активности.
Если вы не хотите использовать keepalive, вы можете использовать keepalive на уровне приложения, например, отправка чего-то вроде специфичных для приложения эхо-сообщений.