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_READ或SSL_ERROR_WANT_WRITE,指示SSL正在等待什么。
-
所以我需要SSL_get_fd()并将其设置为非阻塞?
-
@Chris Becke:我一直将套接字设置为非阻塞,然后再将其传递给SSL_set_fd()。如果您使用的是BIO,则可以使用BIO_set_nbio()将BIO设置为非阻塞。
与BIO_new_socket或BIO_new_connect/accept一起使用BIO_set_nbio的代码可能比创建内存BIO的代码少。不知道是否还有其他标准。该文档对此进行了更详细的解释:
http://www.openssl.org/docs/crypto/BIO_s_connect.html
- BIO_new_connect绝对是使用OpenSSL创建SSL套接字的规范方法。我的查询集中在:将OpenSSL套接字合并到其中不能阻止SSL_read的程序中的最佳实践/最省力方法是什么。