【发布时间】:2012-08-06 20:11:19
【问题描述】:
当用 openssl 编写的服务器不调用 SSL_accept 时,客户端的 SSL_connect 将永远阻塞。 openssl -SSL_CTX_set_timeout , SSL_SESSION_set_timeout 中有一些超时功能,但这些对 SSL_connect 没有影响。
真的没有办法为 SSL_connect 设置超时,例如ssl 服务器有问题,在进行 SSL 握手之前进入循环?
【问题讨论】:
当用 openssl 编写的服务器不调用 SSL_accept 时,客户端的 SSL_connect 将永远阻塞。 openssl -SSL_CTX_set_timeout , SSL_SESSION_set_timeout 中有一些超时功能,但这些对 SSL_connect 没有影响。
真的没有办法为 SSL_connect 设置超时,例如ssl 服务器有问题,在进行 SSL 握手之前进入循环?
【问题讨论】:
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 和超时来调用选择函数。如果选择超时,您可以认为您的SSL_connect 已超时。
注意:SSL_SESSION_set_timeout 用于设置与 SSL 恢复相关的会话超时值。它们与连接超时无关。
以下链接应该对您有所帮助(尤其是第二个链接,第 6 节讨论多路复用 I/O):