比较 boost::system::error_category

2024-04-30

对于 errorCode.category().name() 输出“asio.misc”和 errorCode.message() 输出“文件结束”的错误,以下比较失败

如果它声称属于 asio.misc 类别,那么为什么 (errorCode.category() == boost::asio::error::misc_category ) 的 if 条件评估为 false?

谷歌搜索(包括此处的答案)说 boost::system::error_code 在多个类别中可以具有相同的值,因此我假设为了获得正确的消息和含义,我们必须比较 boost::system::error_category以及 boost::system::error_code::value。

如果这不起作用,我们如何正确比较类别?

有问题的代码:

//--------------------------------------------------------------------------------------------------
std::string ClientSocketASIO::ErrorCodeToString(const boost::system::error_code & errorCode)
{
    std::ostringstream debugMsg;
    debugMsg << " Error Category: " << errorCode.category().name() << ". "
             << " Error Message: "  << errorCode.message() << ". ";

    if( errorCode.category() == boost::asio::error::misc_category )
    {
        switch (errorCode.value())
        {
        case boost::asio::error::eof:
            debugMsg << ". Server has disconnected.";
            break;
        case boost::asio::error::connection_refused:
            debugMsg << ". Connection Refused";
            break;
        default:
            debugMsg << ". Unknown Error.";
            break;
        }
    }
    else
    {
        debugMsg << ". Unknown Error category.";
    }

    return debugMsg.str();
}

EDIT:

根据https://theboostcpplibraries.com/boost.system https://theboostcpplibraries.com/boost.system and Boost::file_system:检查错误代码 https://stackoverflow.com/questions/23848942/boostfile-system-checking-error-codes/23849966#23849966

人们通常错误地编写代码,只比较错误值而不比较类别。错误值本身并不唯一,并且可能出现在多个类别中。用户还可以自由创建自己的错误代码和类别。因此,必须将两者进行比较。我认为,这不会影响大量应用程序,因为无论如何它们都只使用一种功能或库来提升其项目和/或大多数错误代码都映射到 Windows 错误代码,这会尽最大努力不这样做碰撞。

我必须在另一台计算机上才能访问增强邮件列表,因为我的工作几乎阻止了所有内容。

http://boost.2283326.n4.nabble.com/Compare-boost-system-error-category-td4692861.html#a4692869 http://boost.2283326.n4.nabble.com/Compare-boost-system-error-category-td4692861.html#a4692869

据那边的人说,比较失败的原因是boost库是静态链接的,boost::system::error_category::operator ==比较地址,所以左手是一个lib中的地址,右手是一个lib中的地址是另一个中的地址。当他们期望的时候,他们不会是平等的。

对我来说,使用运算符 == 的地址似乎是一个非常愚蠢的举动。如果发现任何新知识,我将继续在 boost 邮件列表上对此进行咆哮,并在这里为其他人进行编辑。

现在,我动态链接并使用表单

//--------------------------------------------------------------------------------------------------
std::string ClientSocketASIO::ErrorCodeToString(const boost::system::error_code & errorCode)
{
    std::ostringstream debugMsg;
    debugMsg << " Error Category: " << errorCode.category().name() << ". "
             << " Error Message: "  << errorCode.message() << ". ";

    // IMPORTANT - These comparisons only work if you dynamically link boost libraries
    //             Because boost chose to implement boost::system::error_category::operator == by comparing addresses
    //             The addresses are different in one library and the other when statically linking.
    //
    // We use make_error_code macro to make the correct category as well as error code value.
    // Error code value is not unique and can be duplicated in more than one category.
    if (errorCode == make_error_code(boost::asio::error::connection_refused))
    {
        debugMsg << ". Connection Refused";
    }
    else if (errorCode == make_error_code(boost::asio::error::eof))
    {
        debugMsg << ". Server has disconnected.";
    }
    else
    {
        debugMsg << ". boost::system::error_code has not been mapped to a meaningful message.";
    }

    return debugMsg.str();
}

但是,当我静态链接以提升时,这不起作用。如果有人对我们如何正确比较 boost::system::error_code 并获得预期结果有更多建议,请让我们深入探讨。


C++ 11 标准意味着每个错误类别实例应具有 全球唯一的地址和平等比较应使用 进行比较的地址。不幸的是,这在便携式设备中并不可靠 代码中,只有 Dinkumware STL 实现了真正的地址唯一性 在这个过程中的任何地方,它都会添加一个完整的内存屏障来实现 即它很昂贵。

Boost 的实现质量与 libstdc++ 或 libc++ 相同, 在某些情况下你可以获得多个实例 可以有不同的地址。

在我自己的代码中,我首先执行比较运算符,如果失败我 对类别的 name() 执行 strcmp()。到目前为止,这还没有咬到我。 我个人认为错误类别的这个方面是 标准中的缺陷,如指定的那样,它强制非标头仅 如果您希望它符合要求,则可以实施,但即使这样也不符合要求 覆盖 RTLD_LOCAL 这意味着您需要退回到命名共享 记忆或一些黑客。

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

比较 boost::system::error_category 的相关文章

  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • GCC C++ (ARM) 和指向结构体字段的 const 指针

    假设有一个简单的测试代码 typedef struct int first int second int third type t define ADDRESS 0x12345678 define REGISTER type t ADDRE
  • 将处理后的图形绘制到另一个图形中

    我想将一个经过处理的图形绘制到另一个图形中 I have two graphics var gHead Graphics FromImage h var gBackground Graphics FromImage b Transform
  • 添加对共享类的多个 WCF 服务的服务引用

    我正在尝试将我的 WCF Web 服务拆分为几个服务 而不是一个巨大的服务 但是 Visual Studio Silverlight 客户端 复制了两个服务共享的公共类 这是一个简单的例子来说明我的问题 在此示例中 有两个服务 两者都返回类
  • 捕获 foreach 条件中抛出的异常

    我有一个foreach在 foreach 本身的条件下循环期间中断的循环 有没有办法try catch抛出异常然后继续循环的项 这将运行几次 直到异常发生然后结束 try foreach b in bees exception is in
  • Blazor 与 Razor

    随着 Blazor 的发明 我想知道这两种语言之间是否存在显着的效率 无论是在代码创建方面还是在代码的实际编译 执行方面 https github com SteveSanderson Blazor https github com Ste
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 为什么密码错误会导致“填充无效且无法删除”?

    我需要一些简单的字符串加密 所以我编写了以下代码 有很多 灵感 来自here http www codeproject com KB security DotNetCrypto aspx create and initialize a cr
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 禁用 LINQ 上下文的所有延迟加载或强制预先加载

    我有一个文档生成器 目前包含约 200 个项目的查询 但完成后可能会超过 500 个 我最近注意到一些映射表示延迟加载 这给文档生成器带来了一个问题 因为它需要根据生成的文档来访问所有这些属性 虽然我知道DataLoadOptions可以指
  • C# 编译器如何决定发出可重定向的程序集引用?

    NET Compact Framework 引入了可重定向程序集引用 现在用于支持可移植类库 基本上 编译器会发出以下 MSIL assembly extern retargetable mscorlib publickeytoken 7C
  • “MyClass”的类型初始值设定项引发异常

    以下是我的Windows服务代码 当我调试代码时 我收到错误 异常 CSMessageUtility CSDetails 的类型初始值设定项引发异常 using System using System Collections Generic
  • 从匿名类型获取值

    我有一个方法如下 public void MyMethod object obj implement 我这样称呼它 MyMethod new myparam waoww 那么我该如何实施MyMethod 获取 myparam 值 Edit
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 内核开发和 C++ [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 从我know https stackoverflow com questions 580292 what languages are windo
  • 如何在 GCC 5 中处理双 ABI?

    我尝试了解如何克服 GCC 5 中引入的双重 ABI 的问题 但是 我没能做到 这是一个重现错误的非常简单的示例 我使用的GCC版本是5 2 如您所见 我的主要函数 在 main cpp 文件中 非常简单 main cpp include
  • 热重载时调用方法

    我正在使用 Visual Studio 2022 和 C 制作游戏 我想知道当您热重新加载应用程序 当它正在运行时 时是否可以触发一些代码 我基本上有 2 个名为 UnloadLevel 和 LoadLevel 的方法 我想在热重载时执行它
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • boost::program_options:带有固定和可变标记的参数?

    是否可以在 boost program options 中使用此类参数 program p1 123 p2 234 p3 345 p12 678 即 是否可以使用第一个标记指定参数名称 例如 p 后跟一个数字 是动态的吗 我想避免这种情况
  • Azure函数版本2.0-应用程序blobTrigger不工作

    我有一个工作功能应用程序 它有一个 blob 输入和一个事件中心输出 在测试版中工作 随着最新的更改 我的功能不再起作用 我尝试根据发行说明更新 host json 文件 但它没有引用 blob 触发器 version 2 0 extens

随机推荐

  • 对所有列实施搜索过滤器

    我在 PostgreSQL 中找到了这个搜索示例http www postgresql org docs current interactive textsearch tables html TEXTSEARCH TABLES SEARCH
  • 使用接口将泛型委托转换为另一种类型

    使用 NET 4 0 好的 所以我有 private Dictionary
  • flink - 使用匕首注入 - 不可序列化?

    我使用 Flink 最新通过 git 从 kafka 流式传输到 cassandra 为了简化单元测试 我通过 Dagger 添加依赖注入 ObjectGraph 似乎已正确设置自身 但 内部对象 被 Flink 标记为 不可序列化 如果我
  • Angular 2/4 存储令牌的位置

    我有一个用于生成令牌的 REST API 我在 Angular 4 客户端中使用它 但问题是在哪里存储该令牌 在互联网上我发现我可以存储在本地存储或cookie中 所以我的问题是 如果存储令牌是本地存储 并且我刚刚从另一个浏览器复制了有效令
  • 如何使用 Jetty 提供 JSP 文件?

    我嵌入了 jetty 提供单个 servlet 和一些静态内容 我从下载了码头http download eclipse org jetty 7 4 5 v20110725 dist http download eclipse org je
  • 如何创建基本时间戳或日期? (Python 3.4)

    作为初学者 创建时间戳或格式化日期最终比我预期的更具挑战性 有哪些基本的例子可供参考 最终 您希望查看日期时间文档并熟悉格式化变量 但这里有一些示例可以帮助您入门 import datetime print Timestamp Y m d
  • VS CODE 中的 WEBGL 自动完成

    我有一个学校项目 我需要使用 WEBGL 但是在没有自动补全的情况下编写所有代码是相当困难的 我没有找到合适的扩展名 你有想法吗 为了让 Visual Studio 代码能够自动完成 它需要知道变量的类型 例如 如果你有这个 const g
  • 密码恢复:如何解密 md5 加密的密码? [复制]

    这个问题在这里已经有答案了 可能的重复 是否可以解密 md5 哈希值 https stackoverflow com questions 1240852 is it possible to decrypt md5 hashes 在我的网站中
  • switch 语句里面有 switch 语句?

    我必须评估很多条件 就我而言 我必须做这样的事情 switch id case 5 switch some other cases here case 6 set some value 在情况 5 中再进行一次切换是个好习惯吗 如果不是 那
  • 排除测试的 Maven 依赖

    我有编译和运行时所需的依赖项 但我想在运行测试时排除它 这可能吗 也许 通过设置个人资料 但我如何仅停用它test生命周期阶段 您可以在测试阶段 重新 配置类路径 这要归功于Maven Surefire 插件 http maven apac
  • Visual Studio 2015 Docker 集成不会附加调试

    我使用 VS 2015 创建了一个 Default net Core RC2 MVC 应用程序 我添加了 Docker 支持 以便我可以在 docker 中运行和调试它 当我运行该项目时 它会构建 docker 容器并启动它 运行命令 do
  • Biztalk 2009 和 2010 .btproj 项目中的增量构建支持吗?

    在追求增量构建时间改进时 我发现 btproj 文件以及依赖于这些文件的所有其他项目都会在每个增量构建上 部分 重建 一直跟踪到 BizTalkCommon targets 我发现它对程序集进行了 2 遍编译 但只有第一遍尊重已经构建的工件
  • 对登录 Instagram 的 PhantomJS 代码进行故障排除

    我编写了这个 PhantomJS 脚本来自动登录 Instagram 它可以成功填写表单字段并按提交按钮 但它总是被重定向回登录屏幕并显示以下消息 你的用户名或密码不正确 我 100 确信凭据是正确的 并且我用多个 Instagram 帐户
  • d3.js 和 Chart.js 之间的比较(仅适用于图表)[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我在项目中多次使用过 Chart js 但从未使用过 d3 js 很多人说 d3 js 是最好的图表 javascript 框架 但没
  • 如何获取 Highcharts 中某个点的索引?

    我正在使用 Highcharts 的 具有不规则间隔的时间数据 图表 如您所知 当鼠标移动到线条点上时 格式化程序函数将运行并显示一些信息 我想知道鼠标在其上移动的点的索引 因此 如果鼠标移动到该线的第一个点上 工具提示将显示 1 第二个点
  • 为什么不能直接访问带索引的数组?

    当我尝试直接使用索引访问数组元素时 我感到很困惑 我想我可以在编码中更好地解释它 我有一个 Employee 类的对象 我将其 TypeCast 到数组并尝试像这样显示它 arrOfObj array objEmployee arrKeys
  • windows bat 文件中的 bang 字符是什么意思?

    我正在尝试更正一个使用 bang 字符的 bat 文件 我本来期望某种形式的引用 就像是 set some var some var 然后后来 some command some var 看起来第一个是在禁用回显的情况下提示输入 例如提示输
  • Django 压缩器和模板继承

    我正在使用Django 压缩器 https github com mintchaos django compressorDjango 1 2 3 中的 app 用于缩小和合并许多包含的 CSS 和 JS 文件 在基本模板中 我有 load
  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • 比较 boost::system::error_category

    对于 errorCode category name 输出 asio misc 和 errorCode message 输出 文件结束 的错误 以下比较失败 如果它声称属于 asio misc 类别 那么为什么 errorCode cate