Cómo gestionar la cola de errores en openssl (SSL_get_error y ERR_get_error)

En OpenSSl, las páginas de manual de La mayoría de las llamadas SSL_ * indican un error al devolver un valor <= 0 y sugieren llamar a SSL_get_error () para obtener el error extendido.

Pero dentro de las páginas del manual para estas llamadas, así como para otras llamadas de la biblioteca OpenSSL, hay referencias vagas al uso de la "cola de errores" en OpenSSL. Tal es el caso en la página del manual paraSSL_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.

Y en esa misma página de manual, la descripción para SSL_ERROR_SSL dice esto:

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

Este tipo de implica que hay algo en la cola de errores que vale la pena leer. Y el no leerlo hace que una llamada posterior a SSL_get_error no sea confiable. Presumiblemente, la llamada a hacer esERR_get_error.

Planeo usar sockets no bloqueantes en mi código. Como tal, es importante que descubra de manera confiable cuando la condición de error es SSL_ERROR_WANT_READ o SSL_ERROR_WANT_WRITE para poder poner el zócalo en el modo de sondeo correcto.

Así que mis preguntas son las siguientes:

¿SSL_get_error () llama a ERR_get_error () implícitamente para mí? ¿O necesito usar ambos?

Debería estar llamandoERR_clear_error ¿Antes de cada llamada a la biblioteca OpenSSL?

¿Es posible que haya más de un error en la cola después de que se complete una llamada de la biblioteca OpenSSL? Por lo tanto, ¿hay circunstancias en las que el primer error en la cola sea más relevante que el último error?

Respuestas a la pregunta(1)

Su respuesta a la pregunta