使用 boost::asio::use_future 增强 asio:async_read()

2024-02-09

打电话时asio::async_read()使用 future,有没有办法获取当 a 时传输的字节数boost:asio::error::eof出现异常?似乎在很多情况下,即使对等方断开连接,人们也希望传输数据。

例如:

namespace ba = boost::asio;

int32_t Session::read (unsigned char* pBuffer, uint32_t bufferSizeToRead)
{
   // Create a mutable buffer
   ba::mutable_buffer buffer (pBuffer, bufferSizeToRead);
   int32_t result = 0;

   // We do an async call using a future.  A thread from the io_context pool does the
   // actual read while the the thread calling this method will blocks on the 
   // std::future::get()
   std::future<std::size_t> future =
         ba::async_read(m_socket, buffer, ba::bind_executor(m_sessionStrand, ba::use_future));
   try
   {
      // We block the calling thread here until we get the results of the async_read_some()...
      result = future.get();
   }
   catch (boost::system::system_error &ex)  // boost::system::system_error
   {
      auto exitCode = ex.code().value();
      if ( exitCode == ba::error::eof )
      {
         log ("Connection closed by the peer");
      }
   }

   return results;  // This is zero if eof occurs
}

上面的代码示例代表了我们的问题。它旨在支持第三方库。库预计会发生阻塞调用。正在开发的新代码使用 ASIO 和最少数量的网络线程。期望的是这个第三方库调用session::read使用其专用线程,我们将调用调整为异步调用。网络调用必须是异步的,因为我们使用最少的线程支持来自不同库的许多此类调用。

出乎意料且后来发现的是 ASIO 将关闭的连接视为错误。没有未来,使用handler我们可以获得传输到发生断开连接的点的字节。但是,使用 future 会引发异常,并且传输的字节变得未知。

void handler (const boost::system::error_code& ec,
      std::size_t bytesTransferred );
  1. 有没有办法在未来执行上述操作并传输字节?
  2. 或者有一种替代方法,我们可以通过仍然使用asio::async_read或类似的。

我们的期望是,即使客户端关闭了连接,我们也可以获得传输的字节。我们很困惑,当使用 future 时,这似乎是不可能的。


这是期货的实施限制。

Modern async_result<>专业化(使用initiate成员方法)可以与as_tuple, e.g.:

ba::awaitable<std::tuple<boost::system::error_code, size_t>> a =
    ba::async_read(m_socket, buffer, ba::as_tuple(ba::use_awaitable));

或者,更典型的是:

auto [ec, n] = co_await async_read(m_socket, buffer, ba::as_tuple(ba::use_awaitable));

然而,相应的:

auto future = ba::async_read(m_socket, buffer, ba::as_tuple(ba::use_future));

目前不支持。可以说可以,但你必须创建自己的完成令牌,或者要求 Asio 开发人员添加支持use_future: https://github.com/chriskohlhoff/asio/issues https://github.com/chriskohlhoff/asio/issues


旁注:如果您构建m_socket来自m_sessioStrand执行人,您不需要bind_executor到股:

using Executor = net::io_context::executor_type;
struct Session {
    int32_t read(unsigned char* pBuffer, uint32_t bufferSizeToRead);

    net::io_context       m_ioc;
    net::strand<Executor> m_sessionStrand{m_ioc.get_executor()};
    tcp::socket           m_socket{m_sessionStrand};
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 boost::asio::use_future 增强 asio:async_read() 的相关文章

  • 为什么 C# Array.BinarySearch 这么快?

    我已经实施了一个很简单用于在整数数组中查找整数的 C 中的 binarySearch 实现 二分查找 static int binarySearch int arr int i int low 0 high arr Length 1 mid
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 按成员序列化

    我已经实现了template
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • HTTPWebResponse 响应字符串被截断

    应用程序正在与 REST 服务通信 Fiddler 显示作为 Apps 响应传入的完整良好 XML 响应 该应用程序位于法属波利尼西亚 在新西兰也有一个相同的副本 因此主要嫌疑人似乎在编码 但我们已经检查过 但空手而归 查看流读取器的输出字
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • C++ OpenSSL 导出私钥

    到目前为止 我成功地使用了 SSL 但遇到了令人困惑的障碍 我生成了 RSA 密钥对 之前使用 PEM write bio RSAPrivateKey 来导出它们 然而 手册页声称该格式已经过时 实际上它看起来与通常的 PEM 格式不同 相
  • 将多个表映射到实体框架中的单个实体类

    我正在开发一个旧数据库 该数据库有 2 个具有 1 1 关系的表 目前 我为每个定义的表定义了一种类型 1Test 1Result 我想将这些特定的表合并到一个类中 当前的类型如下所示 public class Result public
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags
  • C# - OutOfMemoryException 在 JSON 文件上保存列表

    我正在尝试保存压力图的流数据 基本上我有一个压力矩阵定义为 double pressureMatrix new double e Data GetLength 0 e Data GetLength 1 基本上 我得到了其中之一pressur
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况

随机推荐

  • cls() 函数在类方法中做什么?

    今天查看别人的代码 看到了这样的内容 class A B Omitted bulk of irrelevant code in the class def init self uid None self uid str uid classm
  • 过载解析异常

    不确定这是否是 C 4 特定的 但只是注意到了这一点 考虑以下类 class Base protected void Foo object bar DayOfWeek day class Program Base protected voi
  • PDO 相当于 mysql_fetch_array

    我正在努力处理相当于以下查询的 PDO 该查询计算队列中有多少个新项目 并计算出完成它们需要多少周 从而给我一个工作堆栈时间表 count new to be made new SELECT FLOOR SUM TotalNew 7 AS
  • Unity 容器 - 延迟注入

    假设我有课 class Foo FooBase public Foo Settings settings IDbRepository db base settings this db db 基本上 FooBase 通过构造函数接收设置并从配
  • java.lang.ClassCastException:[Ljava.lang.Object;无法转换或 BeanUtils.copyProperties 不起作用

    我是 JPA 新手 并且 Spring Boot 在使用 Query param 时无法获取 api 响应 我尝试实现内部联接 存储库类 Transactional rollbackFor Exception class Modifying
  • 堆栈分配的 RAII 对象与 DI 原理

    在 C 中 我经常使用 RAII 风格的对象来使代码更可靠 并将它们分配在堆栈上以使代码更具性能 并避免 bad alloc 但是在堆栈上创建具体类的对象违反了依赖倒置 DI 原则并阻止了模拟该对象 考虑以下代码 struct IInput
  • 实体框架工具不适用于 UWP 应用程序 C#

    启动项目 EFGetStartedUWP 是一个通用 Windows 平台应用程序 此版本的 Entity Framework Core 包管理器控制台工具不支持此类项目 有关将 EF Core Tools 与 UWP 项目结合使用的详细信
  • 我可以列表初始化仅移动类型的向量吗?

    如果我通过 GCC 4 7 快照传递以下代码 它会尝试复制unique ptrs 进入向量 include
  • 求解热方程

    我求解金属棒的热方程 一端保持在 100 C 另一端保持在 0 C 如下 import numpy as np import matplotlib pyplot as plt dt 0 0005 dy 0 0005 k 10 4 y max
  • '.' 之前应有主要表达式代币

    我已经为此奋斗了一段时间并环顾四周 但我不确定我做错了什么 错误 错误 标记之前应有主表达式 addElement 方法内的大部分代码都会弹出 涉及 BinaryNode variable 但我完全不知道在这里要做什么 include
  • 在delphi中传递不同枚举类型的混合

    我需要编写一个可以传递不同枚举选择的过程 type TEnumOne eOneFlagOne eOneFlagTwo TEnumTwo eTwoFlagOne eTwoFlagTwo 该方法应该采用不同的枚举 Process eOneFla
  • 如何将 p5.js 画布放入 html div 中

    我正在尝试将 p5 js 添加到网页中某一部分的背景 我是 javascript 新手 不知道如何将这两个部分绑定在一起 您需要在设置中添加代码 确保 html 中的脚本标记中也包含该函数 请注意 您不要在 parent 中添加 var m
  • 使用 Lua 时 C++ 中的堆栈展开

    我最近偶然发现了这个 C Lua 错误 int function for lua lua State L std string s Trouble coming return luaL error L something went wron
  • 用于对所有行进行分页的 Cassandra CQL 方法

    我想以编程方式检查大型 cassandra 表中的所有行 并希望使用 CQL 我知道我可以使用 thrift 来做到这一点 使用 multiget 一次获取 10 000 左右 行 并将最后检索到的密钥传递给下一个 multiget 调用
  • 简单的拼写检查算法

    我的任务是为作业创建一个简单的拼写检查器 但几乎没有提供任何指导 所以想知道是否有人可以帮助我 我并不是在找人为我做作业 但任何关于算法的指导或帮助都会很棒 如果我所问的内容不在该网站的指导范围内 那么我很抱歉 我会去其他地方寻找 该项目加
  • Web项目中的Java文件路径

    我需要从类访问我的 Web 项目中的资源文件 问题是我的开发环境的路径和项目部署时的路径不一样 例如 如果我想在开发时访问一些 css 文件 我可以这样做 File file new File src main webapp resourc
  • 生成最小可执行文件的编程语言? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 非常简单的mysql查询不使用索引

    我的 mySQL 表的排序不使用索引 我不知道为什么 我有 CREATE TABLE IF NOT EXISTS test a int 11 NOT NULL b int 11 NOT NULL KEY kk a ENGINE MyISAM
  • C中获取字符串的指针算术

    我想获取字符数组的元素 但根本没有成功 问题是我只获取第一个和最后一个元素 仅此而已 我的代码是 void getcharacters char cad int l int i l strlen cad for i cad 0 i lt c
  • 使用 boost::asio::use_future 增强 asio:async_read()

    打电话时asio async read 使用 future 有没有办法获取当 a 时传输的字节数boost asio error eof出现异常 似乎在很多情况下 即使对等方断开连接 人们也希望传输数据 例如 namespace ba bo