Смущает неблокирующий ввод-вывод OpenSSL

В общем, библиотека OpenSSL (C API), кажется, предлагает два способа сделать все: вы можете либо использовать простые системные сокеты, настроенные по своему вкусу, либо вы можете использовать объекты OpenSSL BIO, которые похожи на потоки.

Однако меня часто смущает дублирование функций. Например, как сделать SSL-соединение неблокирующим? Один из способов - просто получить доступ к базовому файловому дескриптору и установить для него неблокирующий режим с помощью fcntl. Но есть также функция OpenSSL API с именем BIO_set_nbio, которая принимает объект BIO* и устанавливает его в неблокирующий режим.

Итак, как лучше всего настроить неблокирующий сокет SSL? Что произойдет, если вы передадите OpenSSL собственный файловый дескриптор, который уже установлен в неблокирующий режим через fnctl? Вам по-прежнему нужно специально вызывать BIO_set_nbio, чтобы сделать объект BIO неблокирующим?


person Channel72    schedule 22.03.2011    source источник


Ответы (1)


Я думаю, что большинство людей предпочитают интерфейс BIO, но подпрограммы BIO просто используют любые собственные неблокирующие API-интерфейсы сокетов, доступные на платформе. Я не знаю, что будет, если смешать и сопоставить.

Обратите внимание, что неблокирующий ввод-вывод для SSL намного сложнее, чем для TCP в целом. Если вы этого не понимаете, вы будете мучить себя. Есть книги Джона Вьеги и еще одна книга Eric Rescorla, и вы, конечно, можете прочитать список рассылки OpenSSL, чтобы понять, какую изжогу это вызвало. Некоторые хорошие примеры кода, показывающие неблокирующее программирование SSL с OpenSSL, содержатся в программном обеспечении для проекта TOR, и утилиту curl.

person President James K. Polk    schedule 22.03.2011