如何将SSL_read和电子投票结合起来?
How to combine SSL_read and epoll?
我正在编写一个带有基于事件的网络库的HTTP代理服务器(使用epoll(。
假设上游有一个快速的HTTPS和一个缓慢的HTTP(S(下游。所以我必须将上游数据存储到缓冲区,并在缓冲区已满时将上游读取事件从网络库中分离出来。
但正如我们所知,SSL_read
可能会部分返回数据。因此,请考虑以下情况:
- 缓冲区大小
32
,并在网络库上附加读取事件 - 上游发送
32
字节,整个HTTP消息为32
字节 - 网络库调用读取事件回调
- 拨打
SSL_read(ssl, buf, 32)
,SSL_read
返回16
- 将
16
字节发送到下游并在网络库上附加读取事件 - 读取回调永远不会被调用,因为剩余的 16 个字节在 openSSL 缓冲区中,并且没有更多来自上游的字节
那么有没有好的解决方案呢?
OpenSSL 的基于 SSL 的旧版 API 不遵循您尝试使用的传统套接字 I/O 事件模型。
使用非阻塞套接字时,不应在调用SSL_read()
之前等待套接字读取事件。您应该无条件地调用SSL_read()
,并通过返回SSL_ERROR_WANT_READ
错误来让它告诉您何时需要套接字中的更多数据。只有这样,您才应该等待套接字读取事件(如果它返回SSL_ERROR_WANT_WRITE
,请等待套接字写入事件(,然后再调用SSL_read()
。
如果您想使用传统的套接字事件来驱动读取/写入,请改用OpenSSL较新的基于BIO的API。使用 BIO 对将收到的加密字节推送到 OpenSSL 引擎中,让它在读取时将解密的字节推送给您,反之亦然。然后,您可以根据需要处理套接字 I/O。
相关文章:
- 多态性和功能结合
- std::vector的包装器,使数组的结构看起来像结构的数组
- 我可以将一个用clang c++11编译的对象与另一个用c++17编译的对象链接起来吗
- 如何将SSL_read和电子投票结合起来?
- C++ 将重载和覆盖结合起来会导致奇怪的行为
- C++ 特征 - 如何将广播和元素操作结合起来
- 难以将 GP 和 OOP 概念结合起来
- 在 x 方向和 y 方向上计算一次第一索贝尔导数,并将这两者结合起来(对于每个通道)
- 允许在多大程度上将 C 和 C++ 结合起来
- 使用浮点值时,我应该将乘法和除法步骤结合起来吗
- 有没有一种方法可以将编译器防火墙(Pimpl)和默认可复制性的优点结合起来
- 如何将sql::driver与智能指针结合起来
- 是否可以将友谊与继承结合起来访问私有数据成员?
- 是否有可能将统一初始化和构造函数结合起来?
- 如何将完全转发与大括号括起来的初始化式结合起来
- 如何将基于泛型迭代器的算法与基于实现的算法结合起来?
- 在C++中,有没有一种更优雅的方法可以将sprintf和std::string结合起来
- 将C++和 C 结合起来
- 如何将c++与Javascript结合起来
- 你能把标准::recursive_mutex和标准::condition_variable结合起来吗?