是否可以用“iostream”包装现有的 TCP/OpenSSL 会话?

Is it possible to wrap existing TCP/OpenSSL session with `iostream`?

提问人:Vitalii 提问时间:11/2/2018 更新时间:11/15/2018 访问量:162

问:

我使用自定义代码通过本机 Berkeley 套接字接口创建 SSL 连接。我需要包装生成的套接字,以便将用 C++ 编写的现有算法与这些套接字数据一起使用。iostream

有没有简单的方法可以做到这一点,而无需实施和从头开始?streamstreambuf

我学会了.boost::iostreamsboost::asio

我没有找到任何方法将现有的OpenSSL会话包装起来。或者可能有人知道如何做到这一点?boost::asio

在我专注于 .boost:asioboost:iostreams

boost::iostreams看起来是个好主意,但是,它的问题是它使用读取缓冲。因此,如果我们只需要从 SSL 会话中读取 1 个字节,它会要求 TCP 设备读取 4 KB 并导致超时。另一方面,当我将缓冲区大小设置为 时,开始为每个字节调用方法,因此当我尝试写入 10 个字节进行流式处理时,它会调用 10 次。TCP 设备本身不能使用写入缓冲,因为无法将方法转发到设备,因此应用程序级协议可能会期望数据被发送到另一个对等体,而数据仍保留在输出缓冲区中。0boost::iostreamswriteSSL_writeflush

因此,我们需要无缓冲读取和缓冲可刷新写入;boost::iostreams 可能吗?

C++ 提升 IOSTREAM

评论

0赞 Sam Varshavchik 11/2/2018
不,您必须按照预期从头开始实现 的子类。C++ 中很少有部分提供即时满足感。通常情况下,您将不得不自己完成所有工作。rdbuf

答:

0赞 Vitalii 11/15/2018 #1

我自己找到了解决方案。

首先,需要将设备标记为可冲洗。由于此类设备没有现成的模板,因此必须继承并使用多重继承覆盖其类别:device<dual_use, Ch>

struct category : device<dual_use, Ch>::category, flushable_tag

现在,当您在流上通话时,它会将通话转发到您的设备。flush

下一步是禁用流自己的缓冲(即,使用第 2 个和第 3 个参数等于 )。open0

在这样的配置中,将每个字节的数据分别写入设备。但是,您可以在设备级别实现缓冲,并在调用时刷新缓冲区。boostflush