Как грациозно выключить клиента Boost Asio SSL?
Клиент делает некоторыеssl::stream<tcp_socket>::async_read_some()
/ssl::stream<tcp_socket>::async_write()
звонки и в какой-то момент должен выйти, то есть он должен отключить соединение.
призваниеssl::stream<tcp_socket>::lowest_layer().close()
работает, но (как и положено) сервер (openssl s_server -state ...
команда) сообщает об ошибке при закрытии соединения.
Глядя на API правильный путь, кажется, чтобы позвонитьssl::stream<tcp_socket>::async_shutdown()
.
Сейчас есть в основном две ситуации, когда необходимо отключение:
1) Клиент находится вasync_read_some()
обратный вызов и реагирует на команду «выйти» с сервера. Звонить оттудаasync_shutdown()
выдает ошибку «короткого чтения» в обратном вызове выключения.
Это удивительно, но после поиска в Google это кажется нормальным поведением - кажется, нужно проверить, является ли это настоящей ошибкой или нет:
// const boost::system::error_code &ec
if (ec.category() == asio::error::get_ssl_category() &&
ec.value() == ERR_PACK(ERR_LIB_SSL, 0, SSL_R_SHORT_READ)) {
// -> not a real error, just a normal TLS shutdown
}
Сервер TLS, кажется, счастлив, хотя - он сообщает:
DONE
shutting down SSL
CONNECTION CLOSED
2) Аasync_read_some()
активен, но пользователь решает выйти из клиента (например, с помощью команды из stdin). При звонкеasync_shutdown()
из этого контекста происходит следующее:
async_read_some()
обратный вызов выполняется с кодом ошибки «краткое чтение» - вид, ожидаемый сейчасasync_shutdown()
обратный вызов выполняется сОшибка расшифровки или плохая запись Mac код ошибки - это неожиданноСерверная сторона не сообщает об ошибке.
Таким образом, мой вопрос, как правильно отключить клиент TLS с boost asio.