Изменение режима OpenSSL BIO с блокировки на режим без блокировки

У меня есть многопоточное приложение, которое интенсивно использует 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 и воссоздать его, сохраняя при этом все состояние.

7
задан inthemedium 7 December 2011 в 06:16
поделиться