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

时间:2018-11-02 10:46:35

标签: c++ boost iostream

我使用自定义代码通过本地Berkeley套接字接口创建SSL连接。我需要使用iostream包装结果套接字,以将用C ++编写的现有算法用于这些套接字数据。

是否有任何简便的方法,而无需从头实现streamstreambuf

我学会了boost::iostreamsboost::asio

我找不到用boost::asio包装现有OpenSSL会话的任何方法。 或者也许有人知道该怎么做?

boost:asio之后,我将研究重点放在了boost:iostreams上。

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

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

1 个答案:

答案 0 :(得分:0)

我自己找到了解决方案。

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

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

现在,当您在流中呼叫flush时,它将把呼叫转发到您的设备。

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

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