是否可以用"iostream"包装现有的TCP/OOpenSSL会话
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千字节,并导致超时。另一方面,当我将缓冲区大小设置为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
时,它会将呼叫转发到您的设备。
下一步是禁用流本身的缓冲(即,用等于0
的第二个和第三个参数调用open
(。
在这种配置中,CCD_ 20将分别向设备写入数据的每个字节。但是,您可以在设备级实现缓冲,并在flush
调用时刷新缓冲区。
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话
- 我可以与 python 服务器而不是 c++ 客户端建立 tcp/ip 套接字吗?
- 提升 Asio TCP 服务器 处理多个客户端
- 通过TCP的PvP通信问题
- C++ boost::asio::ip::tcp::acceptor 有时不接受连接器?
- AWS IoT 开发工具包:通过 TCP 端口 443 使用 MQTT
- 计算出有多少客户端可以连接到我正在使用的一些tcp服务器代码
- 通过单独的 tcp 流建立 http 连接
- 读取 TCP 标头并使用RAW_SOCKET管理 TCP 连接
- C++ TCP 套接字通信 - 连接按预期工作,几秒钟后失败,没有收到新数据,read() 和 recv() 块
- grpc 的 ServerBuilder::AddListeningPort() 总是返回 TCP 端口零
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在没有侦听器的情况下创建 TCP 连接?
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- C++ TCP 套接字 | 无法将"std::__cxx11::字符串"转换为"const
- C++ "using tcp=x"到"namespace tcp=x"有什么区别
- 同步读取多个 TCP 响应
- 如何将 c++ 中的客户端 TCP 的替身列表发送到 Matlab 中的 TCP 服务器?