Смущен из-за неблокирующего ввода-вывода OpenSSL - PullRequest
9 голосов
/ 23 марта 2011

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

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

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

1 Ответ

8 голосов
/ 23 марта 2011

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

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

...