2010-11-05 74 views
0

無論何時我在Windows或Mac上使用OpenSSL,我都會創建自己的內存BIO,並將它們連接到基於平臺消息的基於(異步非阻塞)套接字實現。 (Windows上的WSAAsyncSelect:Mac上的CFSocket)在沒有線程的情況下使用OpenSSL

Secure programming with the OpenSSL API在ibm.com上託管似乎是實現OpenSSL的最佳參考 - 但它實現了一個非常簡單的阻塞連接。

是否有一種標準的方式來設置和使用OpenSSL和非阻塞套接字 - 例如,如果沒有數據,SSL_read的調用不會阻塞?

回答

0

BIO_set_nbioBIO_new_socketBIO_new_connect/accept結合使用可能比創建內存BIO的代碼少。不知道是否有比這更標準的東西。該文檔更詳細地解釋這一點:

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

+0

BIO_new_connect絕對是使用OpenSSL創建SSL Socket的標準方式。我的查詢集中於:將OpenSSL套接字合併到SSL_read不能阻塞的程序中的最佳實踐/最省力方式。 – 2010-11-08 08:00:19

1

SSL_read()(以及其它SSL功能)如果底層插座被設置非阻塞很好地工作。如果數據不足,它將返回一個小於零的值;調用返回值SSL_get_error()將返回SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE,表示SSL正在等待什麼。

+0

所以我需要SSL_get_fd()並將其設置爲非阻塞? – 2010-11-08 15:29:10

+1

@Chris Becke:在將它傳遞給'SSL_set_fd()'之前,我總是將套接字設置爲非阻塞。如果您使用的是BIO,您可以使用'BIO_set_nbio()'設置您的BIO非阻塞。 – caf 2010-11-08 22:03:51

相關問題