我目前正在探索 Asio 库,并且拥有用于常规 TCP 连接的工作代码。我用了asio::ip::tcp::iostream
对象,因为我想要传输的东西已经可以序列化到 iostreams/从 iostreams 反序列化,所以这非常方便并且对我来说效果很好。
然后我尝试切换到 SSL 连接,就在那时一切都变得疯狂。显然没有内置支持来获取所有其他协议支持安全连接的相同 iostream 接口。从设计的角度来看,这对我来说真的很困惑。出现这种情况有什么原因吗?
我知道其中的讨论如何创建 boost ssl iostream? https://stackoverflow.com/questions/3668128/how-to-create-a-boost-ssl-iostream最后是一个包装类,使用 boost 提供 iostream 功能。除此之外,根据评论,实现是有缺陷的,这也没有提供与其他协议相同的接口(abasic_socket_iostream
),它还允许设置过期时间和关闭连接等。 (我还在非 boost 版本中使用 asio,并且希望尽可能避免将 boost 添加为额外的依赖项)。
所以,我想我的问题是:
- 我到底需要实现什么才能获得 SSL 连接的 basic_socket_iostream ?我认为这将是一个派生
asio::basic_streambuf
or asio::basic_socket_streambuf
但我不知何故无法弄清楚它们是如何工作的并且需要进行调整..只有一堆奇怪的指针移动和缓冲区分配以及文档对我来说很不清楚何时到底会发生什么......
- 为什么这还没有首先存在?让这个协议的行为与任何其他协议完全不同似乎是非常不合理的,因此需要进行重大重构来更改
tcp::iostream
基于项目来支持安全连接
> 好吧,我遇到的问题是 ssl::stream 实际上两者都不做:我没有提供套接字,但它也没有给我一个与其他协议可用的流接口兼容的流接口,是的,从这个意义上说,它的行为与其他的非常不同(没有明显的原因)
我认为该流的行为与其他协议没有任何不同(请参阅https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/streams.html https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/streams.html):
流、短读和短写
Boost.Asio 中的许多 I/O 对象都是面向流的。这意味着:
没有消息边界。正在传输的数据是连续的字节序列。
读或写操作传输的字节数可能少于请求的字节数。这称为短读或短写。
提供面向流的 I/O 模型的对象满足以下一种或多种类型要求:
- SyncReadStream,其中使用名为 read_some() 的成员函数执行同步读取操作。
- AsyncReadStream,其中异步读取操作是使用名为 async_read_some() 的成员函数执行的。
- SyncWriteStream,其中使用名为 write_some() 的成员函数执行同步写入操作。
- AsyncWriteStream,其中使用名为 async_write_some() 的成员函数执行同步写入操作。
面向流的 I/O 对象的示例包括ip::tcp::socket
, ssl::stream<>
, posix::stream_descriptor
, windows::stream_handle
, etc.
也许令人困惑的是你正在与iostream
接口,这根本不是同一个概念(它来自标准库)。
对于如何制作的问题iostream
ssl 流的兼容流包装器,如果不进一步查阅文档并使用编译器(我目前手头没有编译器),我无法设计出答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)