14

当用 openssl 编写的服务器没有调用 SSL_accept 时,客户端的 SSL_connect 将永远阻塞。openssl -SSL_CTX_set_timeout , SSL_SESSION_set_timeout 中有一些超时功能,但这些对 SSL_connect 没有影响。

当例如 ssl 服务器出现故障并在进行 SSL 握手之前进入循环时,真的没有办法为 SSL_connect 设置超时吗?

4

1 回答 1

13

OpenSSL 库在处理套接字相关问题方面为您提供了最大的灵活性。您的情况下的SSL_connect块,因为您必须将它与阻塞套接字一起使用。请与非阻塞套接字一起使用,在这种情况下它将返回 -1。如果你调用SSL_get_error函数,这将给你SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE错误取决于 tcp recv 或 send 分别无法完成操作。

当获得SSL_ERROR_WANT_WRITE/时SSL_ERROR_WANT_READ,您必须通过将套接字传递给适当fd_set的和超时来调用 select 函数。如果选择超时,您可以认为您SSL_connect已经超时。

注意:SSL_SESSION_set_timeout用于设置与 SSL 恢复相关的会话超时值 。它们与超时连接无关。

下面的链接应该对您有所帮助(尤其是第二个链接,第 6 节讨论多路复用 I/O):

于 2012-08-08T10:30:09.923 回答