当用 openssl 编写的服务器没有调用 SSL_accept 时,客户端的 SSL_connect 将永远阻塞。openssl -SSL_CTX_set_timeout , SSL_SESSION_set_timeout 中有一些超时功能,但这些对 SSL_connect 没有影响。
当例如 ssl 服务器出现故障并在进行 SSL 握手之前进入循环时,真的没有办法为 SSL_connect 设置超时吗?
OpenSSL 库在处理套接字相关问题方面为您提供了最大的灵活性。您的情况下的SSL_connect
块,因为您必须将它与阻塞套接字一起使用。请与非阻塞套接字一起使用,在这种情况下它将返回 -1。如果你调用SSL_get_error
函数,这将给你SSL_ERROR_WANT_READ
或SSL_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):