繁体   English   中英

如何结合使用SSL_read和epoll?

[英]How to combine SSL_read and epoll?

我正在使用基于事件的网络库(使用epoll)编写HTTP代理服务器。

假设有一个快速的HTTPS上游和一个缓慢的HTTP(S)下游。 因此,我必须将上游数据存储到缓冲区,并在缓冲区已满时从网络库中分离上游读取事件。

但是众所周知, SSL_read可能会部分返回数据。 因此,请考虑以下情况:

  1. 缓冲区大小为32并在网络库上附加读取事件
  2. 上游发送32个字节, 整个HTTP消息为32个字节
  3. 网络库调用读取事件回调
  4. 调用SSL_read(ssl, buf, 32)SSL_read返回16
  5. 向下游发送16个字节并在网络库上附加读取事件
  6. 读取回调将永远不会被调用,因为剩余的16个字节位于openssl缓冲区中,并且上游没有更多字节

那么有一个好的解决方案吗?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM