Jak zarządzać kolejką błędów w openssl (SSL_get_error i ERR_get_error)

W OpenSSl strony man dla większości wywołań SSL_ * wskazują błąd zwracając wartość <= 0 i sugerując wywołanie SSL_get_error () w celu uzyskania błędu rozszerzonego.

Ale na stronach man dla tych wywołań, jak również dla innych wywołań biblioteki OpenSSL, istnieją niejasne odniesienia do używania „kolejki błędów” w OpenSSL - tak jest w przypadku strony man dlaSSL_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.

I na tej samej stronie podręcznika człowieka, opis dla SSL_ERROR_SSL mówi tak:

   SSL_ERROR_SSL
       A failure in the SSL library occurred, usually a protocol error.
       The OpenSSL error queue contains more information on the error.

Ten rodzaj sugeruje, że w kolejce błędów warto coś przeczytać. A brak odczytu powoduje, że kolejne wywołanie SSL_get_error jest zawodne. Przypuszczalnie jest to wezwanieERR_get_error.

W moim kodzie zamierzam używać gniazd nieblokujących. Dlatego ważne jest, aby niezawodnie odkryć, kiedy warunek błędu to SSL_ERROR_WANT_READ lub SSL_ERROR_WANT_WRITE, dzięki czemu mogę umieścić gniazdo w prawidłowym trybie odpytywania.

Oto moje pytania:

Czy SSL_get_error () wywołuje dla mnie ERR_get_error ()? Czy muszę użyć obu?

Czy powinienem dzwonićERR_clear_error przed każdym wywołaniem biblioteki OpenSSL?

Czy jest możliwe, że po zakończeniu wywołania biblioteki OpenSSL może być więcej niż jeden błąd w kolejce? Czy zatem istnieją okoliczności, w których pierwszy błąd w kolejce jest bardziej istotny niż ostatni błąd?

questionAnswers(1)

yourAnswerToTheQuestion