是否可以用 `iostream` 包装现有的 TCP/OpenSSL 会话?
Is it possible to wrap existing TCP/OpenSSL session with `iostream`?
我使用自定义代码通过本机 Berkeley 套接字接口创建 SSL 连接。我需要用 iostream
包装结果套接字,以便将用 C++ 编写的现有算法与这些套接字数据一起使用。
有没有不需要从头开始实施 stream
和 streambuf
的简单方法?
我学会了boost::iostreams
和boost::asio
。
我没有找到任何方法来用 boost::asio
包装现有的 OpenSSL 会话。 或者有人知道怎么做吗?
在 boost:asio
之后,我将研究重点放在 boost:iostreams
上。
boost::iostreams
看起来是个好主意,但是,它的问题是它使用了读取缓冲。因此,如果我们只需要从 SSL 会话中读取 1 个字节,它会要求 TCP 设备读取 4 KB 并导致超时。另一方面,当我将缓冲区大小设置为 0
时,boost::iostreams
开始为每个字节调用 write
方法,因此当我尝试将 10 个字节写入流时,它会调用 SSL_write
10次。 TCP 设备本身不能使用写缓冲,因为没有办法将 flush
方法转发给设备,因此应用程序级协议可能期望将数据发送到另一个对等点,同时数据保留在输出缓冲区中。
因此,我们需要无缓冲的读取和缓冲的可刷新写入; boost::iostreams
可以吗?
我自己找到了解决方案。
首先,需要将设备标记为可冲洗。由于此类设备没有现成的模板,因此您必须继承device<dual_use, Ch>
并使用多重继承覆盖其类别:
struct category : device<dual_use, Ch>::category, flushable_tag
现在,当您在直播中呼叫 flush
时,它会将呼叫转接至您的设备。
下一步是禁用流自身缓冲(即调用 open
,第二个和第三个参数等于 0
)。
在这样的配置中boost
将分别写入设备的每个字节的数据。但是,您可以在设备级别实现缓冲,并在 flush
调用时刷新缓冲区。
我使用自定义代码通过本机 Berkeley 套接字接口创建 SSL 连接。我需要用 iostream
包装结果套接字,以便将用 C++ 编写的现有算法与这些套接字数据一起使用。
有没有不需要从头开始实施 stream
和 streambuf
的简单方法?
我学会了boost::iostreams
和boost::asio
。
我没有找到任何方法来用 boost::asio
包装现有的 OpenSSL 会话。 或者有人知道怎么做吗?
在 boost:asio
之后,我将研究重点放在 boost:iostreams
上。
boost::iostreams
看起来是个好主意,但是,它的问题是它使用了读取缓冲。因此,如果我们只需要从 SSL 会话中读取 1 个字节,它会要求 TCP 设备读取 4 KB 并导致超时。另一方面,当我将缓冲区大小设置为 0
时,boost::iostreams
开始为每个字节调用 write
方法,因此当我尝试将 10 个字节写入流时,它会调用 SSL_write
10次。 TCP 设备本身不能使用写缓冲,因为没有办法将 flush
方法转发给设备,因此应用程序级协议可能期望将数据发送到另一个对等点,同时数据保留在输出缓冲区中。
因此,我们需要无缓冲的读取和缓冲的可刷新写入; boost::iostreams
可以吗?
我自己找到了解决方案。
首先,需要将设备标记为可冲洗。由于此类设备没有现成的模板,因此您必须继承device<dual_use, Ch>
并使用多重继承覆盖其类别:
struct category : device<dual_use, Ch>::category, flushable_tag
现在,当您在直播中呼叫 flush
时,它会将呼叫转接至您的设备。
下一步是禁用流自身缓冲(即调用 open
,第二个和第三个参数等于 0
)。
在这样的配置中boost
将分别写入设备的每个字节的数据。但是,您可以在设备级别实现缓冲,并在 flush
调用时刷新缓冲区。