是否可以用"iostream"包装现有的TCP/OOpenSSL会话

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

本文关键字:quot TCP 会话 OOpenSSL iostream 是否 包装      更新时间:2023-10-16

我使用自定义代码在原生Berkeley套接字接口上创建SSL连接。我需要用iostream包装得到的套接字,以便使用这些套接字数据使用C++编写的现有算法。

有没有什么简单的方法可以做到这一点而不需要从头开始实现streamstreambuf

我学习了boost::iostreamsboost::asio

我没有找到任何方法来用boost::asio包装现有的OpenSSL会话或者可能有人知道怎么做

boost:asio之后,我集中研究了boost:iostreams

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

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

我自己找到了解决方案。

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

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

现在,当您在流媒体上呼叫flush时,它会将呼叫转发到您的设备。

下一步是禁用流本身的缓冲(即,用等于0的第二个和第三个参数调用open(。

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