Как грациозно выключить клиента 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.

Ответы на вопрос(1)

Ваш ответ на вопрос