【问题标题】:How to combine SSL_read and epoll?如何结合 SSL_read 和 epoll?
【发布时间】:2019-09-05 08:16:17
【问题描述】:

我正在使用基于事件的网络库(使用 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 缓冲区中,并且没有更多来自上游的字节

那么有什么好的解决办法吗?

【问题讨论】:

    标签: c++ c openssl network-programming


    【解决方案1】:

    OpenSSL 较旧的基于 SSL 的 API 不遵循您尝试使用的传统套接字 I/O 事件模型。

    当使用非阻塞套接字时,您不应该在调用SSL_read() 之前等待套接字读取事件。您应该无条件地调用SSL_read(),并通过返回SSL_ERROR_WANT_READ 错误来告诉您何时需要来自套接字的更多数据。只有这样,您才应该在再次调用SSL_read() 之前等待套接字读取事件(如果它返回SSL_ERROR_WANT_WRITE,则改为等待套接字写入事件)。

    如果您想使用传统的套接字事件来驱动您的读/写,请改用 OpenSSL 较新的基于 BIO 的 API。使用 BIO 对将接收到的加密字节推送到 OpenSSL 引擎中,并让它在读取时将解密的字节推送给您,反之亦然。然后你可以随心所欲地处理套接字 I/O。

    【讨论】:

      猜你喜欢
      • 2014-06-24
      • 1970-01-01
      • 2019-03-26
      • 2021-01-10
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 2016-09-01
      • 1970-01-01
      相关资源
      最近更新 更多