Openssl ssl_connect блоки навсегда - как установить тайм-аут?

когда сервер, написанный в openssl, не вызывает SSL_accept, клиент SSL_connect блокирует навсегда. Есть несколько тайм-аутов в openssl -SSL_CTX_set_timeout, SSL_SESSION_set_timeout, но они не влияют на SSL_connect.

Не существует способа установить тайм-аут для SSL_connect, когда, например, Сервер ssl неисправен и переходит в цикл, прежде чем выполнить SSL-квитирование?

Ответ 1

Библиотека 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, в которой говорится о мультиплексном вводе/выводе):