当用openssl编写的服务器没有调用SSL_accept时,客户端的SSL_connect永远阻塞。 openssl -SSL_CTX_set_timeout,SSL_SESSION_set_timeout中有一些超时函数,但这些函数对SSL_connect没有影响。
在例如SSL_connect时,是否真的无法设置超时ssl服务器有问题,在进行SSL握手之前进入循环?
答案 0 :(得分:11)
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):