gpt4 book ai didi

sockets - 如何在 openssl 中管理错误队列(SSL_get_error 和 ERR_get_error)

转载 作者:太空宇宙 更新时间:2023-11-03 12:39:06 27 4
gpt4 key购买 nike

在 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.

在同一个手册页中,对 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 库调用完成后,队列中是否可能存在多个错误?因此,是否存在队列中第一个错误比最后一个错误更相关的情况?

最佳答案

  • SSL_get_error 不调用 ERR_get_error。因此,如果您只调用 SSL_get_error,错误将保留在队列中。
  • 您应该在调用 SSL_get_error 之后的任何 SSL 调用(SSL_read、SSL_write 等)之前调用 ERR_clear_error,否则您可能会读取当前线程中先前发生的旧错误。

关于sockets - 如何在 openssl 中管理错误队列(SSL_get_error 和 ERR_get_error),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18179128/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com