Изменение OpenSSL BIO с блокировки на неблокирующий режим - PullRequest
6 голосов
/ 07 декабря 2011

У меня есть многопоточное приложение, которое интенсивно использует OpenSSL в C. Оно разработано с мыслью, что все его SSL-соединения должны блокироваться.В частности, блокирование БИО.Все они распределяются по одному входящему порту, как это:

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

1 Ответ

5 голосов
/ 21 марта 2012

Я делал неблокирующие соединения SSL в своем собственном «львином» коде, но я совсем не использовал функциональность BIO в OpenSSL.

Скорее, я пошел на вызовы SSL_set_fd(ctx, fd ) и SSL_get_fd(ssl), чтобы обработать свои собственные fdsets и вызвать select.

Самым большим «пойманным», который потребовалось некоторое время, чтобы отследить, было установить SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER и SSL_MODE_ENABLE_PARTIAL_WRITE для его работы так, как я хотел.

Если вы хотите прочитать часть SSLкода здесь:

https://github.com/lundman/lion/blob/master/src/tls.c

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...