У меня есть многопоточное приложение, которое интенсивно использует OpenSSL в C. Оно разработано с мыслью, что все его SSL-соединения должны блокироваться. В частности, блокировка BIO. Все они распределяются из одного входящего порта следующим образом:
ssl = SSL_new(ctx);
SSL_set_mode(ssl, SSL_MODE_AUTO_RETRY);
sock = BIO_new_socket(socket, BIO_CLOSE);
SSL_set_bio(ssl, sock, sock);
Однако оказывается, что есть несколько небольших частей кодовой базы, где использование неблокирующих BIO было бы лучшим выбором. Мелкие части, которым неблокирующие BIO принесут пользу, не имеют возможности узнать, какие SSL-соединения будут им принадлежать. Таким образом, они всегда получают блокирующие BIO.
Вопрос в том, можно ли изменить блокирующие BIO на неблокирующие?
Я знаю, что BIO_set_nbio можно использовать для неблокирующего BIO, но в документации сказано:
Вызов BIO_set_nbio () должен быть выполнен до того, как соединение будет установлено, потому что неблокирующий ввод-вывод устанавливается во время процесса соединения.
Другой возможный вариант, о котором я подумал, - это скопировать BIO и воссоздать его, сохраняя при этом все состояние.