为什么没有 asio::ssl::iostream? (以及如何实施)

2023-12-22

我目前正在探索 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 添加为额外的依赖项)。

所以,我想我的问题是:

  1. 我到底需要实现什么才能获得 SSL 连接的 basic_socket_iostream ?我认为这将是一个派生asio::basic_streambuf or asio::basic_socket_streambuf但我不知何故无法弄清楚它们是如何工作的并且需要进行调整..只有一堆奇怪的指针移动和缓冲区分配以及文档对我来说很不清楚何时到底会发生什么......
  2. 为什么这还没有首先存在?让这个协议的行为与任何其他协议完全不同似乎是非常不合理的,因此需要进行重大重构来更改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接口,这根本不是同一个概念(它来自标准库)。

对于如何制作的问题iostreamssl 流的兼容流包装器,如果不进一步查阅文档并使用编译器(我目前手头没有编译器),我无法设计出答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么没有 asio::ssl::iostream? (以及如何实施) 的相关文章

  • Directory.Delete 之后 Directory.Exists 有时返回 true ?

    我有非常奇怪的行为 我有 Directory Delete tempFolder true if Directory Exists tempFolder 有时 Directory Exists 返回 true 为什么 可能是资源管理器打开了
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 复制 std::function 的成本有多高?

    While std function是可移动的 但在某些情况下不可能或不方便 复制它会受到重大处罚吗 它是否可能取决于捕获变量的大小 如果它是使用 lambda 表达式创建的 它依赖于实现吗 std function通常被实现为值语义 小缓
  • C中的malloc内存分配方案

    我在 C 中尝试使用 malloc 发现 malloc 在分配了一些内存后浪费了一些空间 下面是我用来测试 malloc 的一段代码 include
  • 当我们想要返回对象的引用时,为什么我们在赋值运算符中返回 *this 而通常(而不是 this)?

    我正在学习 C 和指针 我以为我理解了指针 直到我看到这个 一方面 asterix 运算符是解引用的 这意味着它返回值所指向的地址中的值 而与号 运算符则相反 它返回值存储的地址记忆 现在阅读有关赋值重载的内 容 它说 我们返回 this因
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 如何检测表单的任何控件的变化?

    如何检测 C 中表单的任何控件的更改 由于我在一个表单上有许多控件 并且如果表单中的任何控件值发生更改 我需要禁用按钮 我正在寻找一些内置函数 事件处理程序 属性 并且不想为此创建自定义函数 不 我不知道任何时候都会触发任何事件any控制表
  • Qt - ubuntu中的串口名称

    我在 Ubuntu 上查找串行端口名称时遇到问题 如您所知 为了在 Windows 上读取串口 我们可以使用以下代码 serial gt setPortName com3 但是当我在 Ubuntu 上编译这段代码时 我无法使用这段代码 se
  • 如何在 32 位或 64 位配置中以编程方式运行任何 CPU .NET 可执行文件?

    我有一个可在 32 位和 64 位处理器上运行的 C 应用程序 我试图枚举给定系统上所有进程的模块 当尝试从 64 位应用程序枚举 32 位进程模块时 这会出现问题 Windows 或 NET 禁止它 我认为如果我可以从应用程序内部重新启动
  • 如何在 Xaml 文本中添加电子邮件链接?

    我在 Windows Phone 8 应用程序中有一些大文本 我希望其中有电子邮件链接 例如 mailto 功能 这是代码的一部分
  • 如何禁用 fread() 中的缓冲?

    我正在使用 fread 和 fwrite 读取和写入套接字 我相信这些函数用于缓冲输入和输出 有什么方法可以在仍然使用这些功能的同时禁用缓冲吗 Edit 我正在构建一个远程桌面应用程序 远程客户端似乎 落后于服务器 我不知道可能是什么原因
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • C++ 条件编译

    我有以下代码片段 ifdef DO LOG define log p record p else define log p endif void record char data 现在如果我打电话log hello world 在我的代码中
  • 从列表中选择项目以求和

    我有一个包含数值的项目列表 我需要使用这些项目求和 我需要你的帮助来构建这样的算法 下面是一个用 C 编写的示例 描述了我的问题 int sum 21 List

随机推荐

  • 堆叠两个具有不同列名的 SQL 表 (2008)

    我检查了这个网站的代码来堆叠两个表 将一个表的结果放在另一个表的结果下面 其中列名不同 我知道当名称相同时 UNION ALL 可以工作 并且我知道当一个表比另一个表拥有更多信息时 对一个表中缺少的列名进行赋值的 UNION ALL 可以工
  • 在 R Markdown 中跳转到某个块的快捷方式?

    是否有跳转到 R Markdown 中的某个块 在 Mac 上 的快捷方式 我正在寻找一种快速从一个块到另一个块的方法 我不完全确定这在 Mac 上是否可行 但在 Windows 版 RStudio 中 您可以选择在 IDE 中显示 文档大
  • 在nodejs中获取视频分辨率

    我一直试图找到这个问题的答案 但没有真正找到答案 如果这听起来很愚蠢或显而易见 请原谅 我有一个 Nodejs 应用程序 基本上我想简单地获取视频的分辨率 想象一下 我在磁盘上存储了一部影片 我希望能够知道它是 720p 还是 1080p
  • 如何检查Android中的UI线程是否运行? [复制]

    这个问题在这里已经有答案了 如何知道正在运行的代码是否在主线程 UI线程 上执行 对于 Swing 我使用isEventDispatchThread方法 使用Looper getMainLooper getThread 获取UI线程 您可以
  • HTTP_INTERCEPTORS 的 multi: true 属性是什么意思?

    我是 Angular 的新手 刚刚构建了一个拦截器 根据多个教程 您必须包括HTTP INTERCEPTORS in the app module像这样 providers provide HTTP INTERCEPTORS useClas
  • 图像路径在 Angular 2 中不起作用

    我放在网站上的所有内容都可以正常运行 但是我尝试放入网站的每个图像 背景除外 都会返回一个404 Not Found Error 我的所有图像都位于 Project src assets images 并且我在 html 文档中尝试了以下
  • vim 用红色突出显示所有内容

    我在执行脚本时向 python 脚本添加了一条打印行 现在当我打开文件时 所有文本都以红色突出显示 打开和关闭文件并不能消除它 打开第二个 python 文件暂时解决了问题 但随后关闭文件并重新打开又使问题再次出现 现在它根本不会消失 有谁
  • 捕获 subprocess.run() 的输出并实时打印它?

    我想使用运行命令subprocess run 然后将其 stdout stderr 作为字符串获取 但我希望子进程在运行时也能正常将其输出打印到控制台 如果我做 result subprocess run ls al 然后我可以看到打印到控
  • OpenMP 和 MPI 哪个更容易学习和调试?

    我有一个数字处理 C C 应用程序 它基本上是不同数据集的主循环 我们可以访问具有 openmp 和 mpi 的 100 个节点集群 我想加快应用程序的速度 但我对 mpi 和 openmp 来说都是绝对的新手 我只是想知道即使性能不是最好
  • XNA 可编辑文本字段

    我知道如何在 XNA 中绘制文本 但我正在实现一个关卡设计器 它需要用户在 UI 中输入文本 我在 Google 上搜索了一下 但找不到如何实现可编辑的文本字段 框架中没有为此构建任何内容吗 你可以使用某种 gui 库 例如http nuc
  • WPF 工具包 DatePicker 仅月/年

    我正在使用上述工具包的日期选择器 但我想将其限制为仅选择月份和年份 因为在这种情况下 用户不知道或不关心确切的日期 显然 数据存储在日期时间中格式将存储日期 但这与我无关 有没有一种简单的方法可以解决这个问题 Thanks 感谢 Ferna
  • 将 Rust 特征传递给 C

    我正在构建一个 Rust 库 需要使用 Rust 对象调用一些 C 函数 我有一个调用 C 函数的函数的特征 C 函数在 Rust 中定义如下 extern fn process trait my trait MyTrait 这个想法是 用
  • 在搜索对话框中添加新运算符

    作为过滤器运算符 您可以从以下选项中进行选择 等于 不等于 小于 小于或等于 大于 大于或等于 开始于 不开始于 在 不 在 结束于 不结束于 包含 和 不包含 我想在此列表中添加一个额外的运算符 有人能指出我实现这一目标的正确方向吗 该应
  • 如何在字符串内迭代循环搜索固定关键字后的任何单词?

    假设我有一个字符串 PHP Paddy PHP Pranav PHP Parth 现在我的计数为3 现在我应该如何在字符串中迭代循环 瞄准 PHP 之后的字符串以显示所有名称 好的 这是字符串 BEGIN IF NEW name OLD n
  • Zend Framework - 不为控制器设置布局

    我有一个控制器 我想使用 ajax 脚本来调用和设置会话变量 获取信息等 如何设置它 以便该特定控制器不使用默认布局 特别是无布局 以便它可以来回发送 XML JSON 消息 就像与 Zend Framework 和 Zend Applic
  • 关闭内存泄漏

    我对垃圾收集语言中内存泄漏的内存 不需要的引用 泄漏的可能性感兴趣 由存储在闭包中的变量引起 可能作为对象系统的一部分或作为基于稍后评估的输入的构建操作的一部分 是否有任何语言中这种情况比较常见 如果是这样 在这些语言中需要注意哪些模式来防
  • 如何在没有包的情况下真正获取类的名称?

    我的问题故意标题几乎一模一样this one https stackoverflow com questions 2690333 how to get the name of a class without the package 但我想要
  • 模板类的成员函数何时实例化?

    考虑以下示例 template
  • 无法导入 com.google.android.maps.MapActivity

    我试着导入 com google android maps MapActivity但我的程序无法识别它 我也有
  • 为什么没有 asio::ssl::iostream? (以及如何实施)

    我目前正在探索 Asio 库 并且拥有用于常规 TCP 连接的工作代码 我用了asio ip tcp iostream对象 因为我想要传输的东西已经可以序列化到 iostreams 从 iostreams 反序列化 所以这非常方便并且对我来