在OpenSSl中,大多数SSL_ *调用的手册页通过返回值< = 0来指示错误,并建议调用SSL_get_error()来获取扩展错误。
但是在这些调用的手册页以及其他OpenSSL库调用中,有一些模糊的引用在OpenSSL中使用“错误队列” - SSL_get_error的手册页就是这种情况:< / p>
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.
在同一个手册页中,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()?或者我是否需要同时使用它们?
我应该在每次OpenSSL库调用之前调用ERR_clear_error吗?
OpenSSL库调用完成后,队列中是否可能出现多个错误?因此,是否存在队列中的第一个错误比上一个错误更相关的情况?
答案 0 :(得分:6)