关于Windows:使用没有线程的OpenSSL

Using OpenSSL without threads

每当我在Windows或Mac上使用OpenSSL时,我总是制作自己的内存BIO,并将它们链接到基于平台消息(异步非阻塞)的套接字实现。 (在Windows上为WSAAsyncSelect:在Mac上为CFSocket)

使用ibm.com上托管的OpenSSL API进行安全编程似乎是实现OpenSSL的最佳参考-但它实现了非常简单的阻塞连接。

是否存在使用非阻塞套接字设置和使用OpenSSL的标准方法-例如,如果没有数据,则不会阻塞对SSL_read的调用?


如果基础套接字设置为非阻塞,则

SSL_read()(和其他SSL函数)可以正常工作。如果没有足够的数据,它将返回小于零的值;否则,返回0。在返回值上调用的SSL_get_error()将返回SSL_ERROR_WANT_READSSL_ERROR_WANT_WRITE,指示SSL正在等待什么。


BIO_new_socketBIO_new_connect/accept一起使用BIO_set_nbio的代码可能比创建内存BIO的代码少。不知道是否还有其他标准。该文档对此进行了更详细的解释:

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