[英]How to combine SSL_read and epoll?
我正在使用基于事件的网络库(使用epoll)编写HTTP代理服务器。
假设有一个快速的HTTPS上游和一个缓慢的HTTP(S)下游。 因此,我必须将上游数据存储到缓冲区,并在缓冲区已满时从网络库中分离上游读取事件。
但是众所周知, SSL_read
可能会部分返回数据。 因此,请考虑以下情况:
32
并在网络库上附加读取事件 32
个字节, 整个HTTP消息为32
个字节 SSL_read(ssl, buf, 32)
和SSL_read
返回16
16
个字节并在网络库上附加读取事件 那么有一个好的解决方案吗?
OpenSSL的较旧的基于SSL的API不遵循您尝试使用的传统套接字I / O事件模型。
使用非阻塞套接字时,不应在调用SSL_read()
之前等待套接字读取事件。 您应该无条件调用SSL_read()
并通过返回SSL_ERROR_WANT_READ
错误让它告诉您何时需要从套接字获取更多数据。 只有这样,您才应该在再次调用SSL_read()
之前等待套接字读取事件(如果它返回SSL_ERROR_WANT_WRITE
,则等待套接字写入事件SSL_read()
。
如果您想使用传统的套接字事件来驱动您的读取/写入,请改用OpenSSL的较新的基于BIO的API。 使用BIO对将接收到的加密字节推送到OpenSSL引擎中,让它在读取时将解密的字节推送给您,在发送时反之亦然。 然后,您可以根据需要处理套接字I / O。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.