Как управлять очередью ошибок в openssl (SSL_get_error и ERR_get_error)
В OpenSSl страницы руководства для большинства вызовов SSL_ * указывают на ошибку, возвращая значение <= 0, и предлагают вызвать SSL_get_error (), чтобы получить расширенную ошибку.
Но в справочных страницах для этих вызовов, а также для других вызовов библиотеки OpenSSL, есть неясные ссылки на использование «очереди ошибок» в OpenSSL - так обстоит дело в справочной странице дляSSL_get_error:
The current thread's error queue must be empty before the TLS/SSL I/O
operation is attempted, or SSL_get_error() will not work reliably.
И на той же самой man-странице описание для SSL_ERROR_SSL гласит:
SSL_ERROR_SSL
A failure in the SSL library occurred, usually a protocol error.
The OpenSSL error queue contains more information on the error.
Этот тип подразумевает, что в очереди ошибок есть что-то, что стоит прочитать. А невозможность его чтения делает последующий вызов SSL_get_error ненадежным. Предположительно, призыв сделать этоERR_get_error.
Я планирую использовать неблокирующие сокеты в моем коде. Поэтому важно, чтобы я достоверно обнаружил, когда в качестве условия ошибки выступает SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE, чтобы я мог перевести сокет в правильный режим опроса.
Итак, мои вопросы таковы:
SSL_get_error () неявно вызывает ERR_get_error () для меня? Или мне нужно использовать оба?
Должен ли я звонитьERR_clear_error до каждого вызова библиотеки OpenSSL?
Возможно ли, что после завершения вызова библиотеки OpenSSL в очереди может появиться более одной ошибки? Следовательно, существуют ли обстоятельства, когда первая ошибка в очереди более важна, чем последняя ошибка?