2010-11-05 8 views
0

Всякий раз, когда я вхожу в OpenSSL на Windows или Mac, я всегда делаю свои собственные BIO памяти и свяжу их с реализацией сокета на основе платформы (асинхронная неблокирующая). (WSAAsyncSelect на окнах: CFSocket на Mac)Использование OpenSSL без потоков

Secure programming with the OpenSSL API, размещенный на ibm.com, кажется лучшим справочником по внедрению OpenSSL, но он реализует очень простое блокирующее соединение.

Существует ли стандартный способ установки и использования OpenSSL с неблокирующими сокетами, так что вызовы SSL_read не будут блокироваться, если нет данных, например?

ответ

0

Использование BIO_set_nbio либо BIO_new_socket, либо BIO_new_connect/accept, вероятно, меньше кода, чем создание памяти BIO. Не уверен, есть ли что-то более стандартное, чем это. Документы объяснить это более подробно:

http://www.openssl.org/docs/crypto/BIO_s_connect.html

+0

BIO_new_connect - это, безусловно, канонический способ создания SSL-гнезда с OpenSSL. Мой запрос сосредоточен на: что является наилучшим практическим/наименее эффективным способом включения сокетов OpenSSL в программу, где SSL_read не должен блокироваться. –

1

SSL_read() (и другие функции SSL) работают хорошо, если основной сокет установлена ​​без блокировки. Если недостаточно данных, оно вернет значение, меньшее нуля; SSL_get_error(), вызванное возвращаемым значением, вернет SSL_ERROR_WANT_READ или SSL_ERROR_WANT_WRITE, указывая, что ожидает SSL.

+0

, так что мне нужно SSL_get_fd() и установить его для блокировки? –

+1

@Chris Becke: Я всегда устанавливал сокет неблокирующимся, прежде чем передавать его в 'SSL_set_fd()'. Если вы используете BIO, вы можете просто отключить блокировку BIO с помощью 'BIO_set_nbio()'. – caf

Смежные вопросы