使用无线程的 OpenSSL
每当我在 Windows 或 Mac 上使用 OpenSSL 时,我总是制作自己的内存 BIO,并将它们链接到基于平台消息的(异步非阻塞)套接字实现。 (Windows 上的 WSAAsyncSelect:Mac 上的 CFSocket)
使用 OpenSSL API 进行安全编程 托管在 ibm.com 上似乎是实现 OpenSSL 的最佳参考 - 但它实现了一个非常简单的阻塞连接。
是否有一种标准方法来设置和使用具有非阻塞套接字的 OpenSSL - 例如,如果没有数据,对 SSL_read 的调用将不会阻塞?
Whenever I bash into OpenSSL on Windows or Mac I always make my own memory BIOs, and link them up to the platforms message based (asynchronous non blocking) socket implementation. (WSAAsyncSelect on windows: CFSocket on Mac)
Secure programming with the OpenSSL API hosted on ibm.com seems to be the best reference on implementing OpenSSL - but it implements a very simple blocking connection.
Is there a standard way to setup and use OpenSSL with non blocking sockets - such that calls to SSL_read will not block if there is no data for example?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果底层套接字设置为非阻塞,
SSL_read()
(以及其他 SSL 函数)可以正常工作。如果可用数据不足,它将返回一个小于零的值;对返回值调用的SSL_get_error()
将返回SSL_ERROR_WANT_READ
或SSL_ERROR_WANT_WRITE
,指示 SSL 正在等待什么。SSL_read()
(and the other SSL functions) work fine if the underlying socket is set non-blocking. If insufficient data is available, it will return a value less than zero;SSL_get_error()
called on the return value will returnSSL_ERROR_WANT_READ
orSSL_ERROR_WANT_WRITE
, indicating what SSL is waiting for.将
BIO_set_nbio
与BIO_new_socket
或BIO_new_connect/accept
一起使用可能比创建内存 BIO 的代码更少。不确定是否还有比这更标准的东西。文档更详细地解释了这一点:http://www.openssl.org/docs/crypto /BIO_s_connect.html
Using
BIO_set_nbio
with eitherBIO_new_socket
orBIO_new_connect/accept
is probably less code than creating memory BIOs. Not sure if there's anything more standard than that. The docs explain this in more detail:http://www.openssl.org/docs/crypto/BIO_s_connect.html