Это действительно зависит от вашего выбора протокола.
Простой протокол командной
Если протокол сервера всегда ожидает сообщения от клиента, вы всегда будете иметь незавершенный async_read
для каждого клиента, подключенного. Это должно возвратиться с ошибкой (EOF), когда клиент отключается каким-либо образом.
Keep-alive - это подход, как указано выше, но в ожидании работы async_read
для этой цели.
Простой протокол событий
Простой протокол событий включает в себя клиент прослушивания данных и сервера, отправившего его. В этом протоколе сервер не знает, есть ли клиент, потому что клиент просто принимает данные и продолжает ждать. Клиент никогда не отправляет серверу никакого сообщения.
Это требование для поддержания жизни. Операции async_write
не срабатывают так же, как async_read
, когда клиент уже отключен.
Есть и другие варианты, например, если у сервера всегда есть ожидающая async_read
операция, которая пытается прочитать 1 байт. Это не удастся, если клиент отключится аналогично обсуждению Simple Command Protocol выше, но никогда не преуспеет ни потому, что клиент не отправляет данные по протоколу Simple Event Protocol.
Вам нужно сердцебиение на уровне приложения - нет другого надежного способа. –