fdbus之CBaseMessage

news2025/2/24 15:34:12

总体介绍

这个类是一个很重要的的类,fdbus中传递对象就是这个类的实例,该类中包含了很多重要的信息。可以这样理解,再fdbus的通信中,这个类的地位至关重要。他们的通信的内容就是该类定义的一些信息。

虽然CFdbBaseObject定义了一些方法,例如invoke、publish等,但是需要指出的消息的实际发出动作都是由CBaseMessage发出的,我们应该这样理解CBaseMessage类,这个类不仅定义了消息的具体字段和结构,比如消息的结构,消息消息头的结构,内容等,还定义了消息的具体操作方法,比如消息的发送,序列化/反序列化等、以及消息的各个部分的偏移和长度等消息的具体信息。还有很多比如该消息是否是同步的,优先级如何等关于消息的所有信息和操作都被这个类持有,这是c++面向对象的核心思想。

消息结构

fdbus消息的结构,从CFdbMessage.h文件可以找到这个注释,通过这个注释我们了解到通信过程中消息的组织方式:

    /*
     *=========================================================
     * buffer structure:
     * +-----+-----+-------+--------------+----------+
     * |  1  |  2  |   3   |      4       |     5    |
     * +-----+-----+-------+--------------+----------+
     *
     * 1: offset; paddings
     * 2: prefix; 0 - 3 bytes: total length (2+3+4+5)
     *            4 - 7 bytes: length of head (3)
     * 3: head
     * 4: payload
     * 5: extra data
     */

  1. 第一部分是一个偏移,该偏移内部数值无效
  2. 第二部分是消息前缀,前缀包含两个字段,第一个字段占用4个字节,含义是总长度,该长度是第二、第三、第四、第五部分的长度之和;第二个字段也是占用4个字节,它的值为第三个部分的长度值。
  3. 第三部分是消息头部。
  4. 第四部分是消息负载,一般而言消息的具体内容会放在这部分
  5. 第五部分是额外数据,该部分内容我还没有搞清楚,可能会存放一些调试信息,例如时间戳之类的。

类图

 方法介绍

这里将消息的操作分成几类,我这哩列出的可能不全,仅仅是将我认为重要的一些方法列出来。再我理解中分成三类:

  1. 消息发送方法,例如pubish、invoke、send、broadcast、subscribe等及dispatchMsg函数,dispatchMsg是一个重要的函数,该函数包含了一系列的发送相关的方法。
  2. 消息体构造方法:包括但不限于消息的组装方法例如buildHeader,deserialize,serialize等还,获取该消息的各个部分的偏移及长度等函数
  3. 消息接收处理函数:例如doRequest,doReply,doBroadcast,autoReply等

成员介绍

该类中包含了很多数据成员,有很多我也搞不清楚到底啥作用,这里将自己知晓的列出来供大家参考:

  • mSn:消息序列号,每个消息都会分配一个,该序列号的作用是用于端点收到回复时判断是否是同一条消息。该字段由内部框架自动赋值,无需用户指定。
  • mCode:消息码,这个是用注册的消息码,由用户注定,用于表示消息类型。
  • mFilter:主题,个人理解是同一个消息码下可以利用该字段进行分支处理。
  • mSid:会话id
  • mType:消息的请求类型,要与mCode区分开,mCode是用户指定的,而mType是框架指定的,用于表面这个消息是什么操作,比如标识是BROADCAST/PUBLISH/REQUEST/REPLY等操作,便于框架进行处理;而mCode是由用户指定的,用户根据该字段的值进行特定的业务处理。
  • mBuffer:用于存储消息的缓存地址
  • mPayloadSize:消息负载的长度
  • mHeadSize:消息头的长度
  • mOffset:偏移的长度
  • mEpid:端点id,没记错的话应该是哪个端点发送,这个值就填哪个端点的值

我认为的一些比较重要点

在看fdbus源码的过程中,对于一个点迷惑了好长时间,就是调用invoke进行同步调用的情况下,用户线程是如何通过输入输出参数将获取到收到消息的内容的呢?搞了好久终于整明白了,这里记录一下,以免后续忘记。

这里只讲原理就不贴源码了,在讲之前首先要搞明白一个事情,会话(session)的作用,一个会话对应一个连接,一个连接对应一个socket,所以从这个角度来说消息的发送和接收都是通过CFdbSession类来实现的。这个类会调用CBaseMessage提供的方法解析消息,并保存到mbuffer中,然后再接收的某个阶段将mbuffer指向的消息地址赋值给原来同步调用线程中保存的CBaseJob::Ptr指向的对象下,这样就实现了同步调用情况下的参数既是输入参数,又是输出参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1045952.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何进一步全面提高项目估算精准度?

项目估算非常重要,这直接关系着项目的成本和收入,如果估算不准确,将为项目带来较大风险。一般软件规模可以用多种方式进行估算,但是用功能点估算方式更准确,而自动估算让估算更快速,我们以CoCode开发的估算…

初识网络编程

一、概述 地球村:亦称世界村,是通过电子媒介将世界紧密联系起来的形象表达,是信息网络时代的集中体现 TCP和UDP: TCP:打电话 -->连接 -->接了 -->通话 UDP:发送完即可 -->接收 计算机网络&a…

QQ表情包存储位置解析

一些常见的设备和系统的QQ表情包存储位置: Windows系统: 路径:C:\Users[用户名]\Documents\Tencent Files[QQ号码]\Image\Image\CustomFace 在这个文件夹中,您可以找到所有自定义的QQ表情包。 Android系统: 路径&am…

程序开发常用在线工具汇总

菜鸟工具# https://c.runoob.com/ 编码# ASCII码# https://www.habaijian.com/ 在线转换# https://www.107000.com/T-Ascii/http://www.ab126.com/goju/1711.html Base64# 在线转换# https://www.qqxiuzi.cn/bianma/base64.htmhttp://www.mxcz.net/tools/Unicode.aspx …

软件架构的演化和维护

软件架构的演化和维护 定义 定义 顶不住了,刷题去了,不搞这个了,想吐。。。

STM32Cube 开发之读写内部Flash--电源项目ADC采样校准系数存储-实现掉电读取数据--STM32或者GD32F处理器

STM32Cube 开发之读写内部Flash–电源项目ADC采样校准系数存储-实现掉电读取数据 一、需求介绍 1.1 在进行电源项目开发中,输入与输出的电压电流经过硬件电路分压或者差分变换后,将低压的电压信号给到单片机如STM32F1系列单片机的ADC采样端口&#xff…

网速Full Power!这款4G网关信号达360度无死角

数字化转型浪潮下,如何实现可靠的无线互联成为制造企业面临的新课题。广州数智自动化最近通过部署星创SG500 4G网关,成功实现了某工业园区全域无线覆盖和多系统安全访问。 SG500支持全球主流的4G网络频段,可灵活搭配通信运营商,提供高达150Mbps的无线传输速率。它采用强大的四核…

性能压测工具:wrk

一般我们压测的时候,需要了解衡量系统性能的一些参数指标,比如。 1、性能指标简介 1.1 延迟 简单易懂。green:一般指响应时间 95线:P95。平均100%的请求中95%已经响应的时间 99线:P99。平均100%的请求中99%已经响应的时间 平…

三.vue2路由知识全总结

Vue Devtools:插件安装,展示模块中的数据 vue-router 应用场景:Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举。 嵌套的路由/视图表模块化的、基于组件的路由配置路由参数、…

谷器数据参加世界制造业大会及数字化转型高峰论坛

9月20日至24日,由工业和信息化部、科技部、商务部、国务院国资委、中国工程院、安徽省人民政府等单位组织共同主办的2023世界制造业大会在合肥市滨湖国际会展中心盛大举行。谷器数据受邀出席,并同期参加”数字化转型高峰论坛”,与国家工信部相…

向量数据库X云计算驱动大模型落地电商行业,Zilliz联合AWS探索并贡献成熟解决方案

近日,由Zilliz 联合亚马逊云科技举办的【向量数据库 X 云计算 驱动大模型落地电商行业】活动在上海落幕,获得业内专业人士的广泛好评。 众所周知,大模型技术的发展正加速对千行万业的改革和重塑,向量数据库作为大模型的海量记忆体、云计算作为大模型的大算力平台,是大模型…

机器人中的数值优化|【五】BFGS算法非凸/非光滑处理

机器人中的数值优化|【五】BFGS算法的非凸/非光滑处理 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法,可行牛顿法的python实现,以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0…

微信里怎么添加阅读付费链接

在微信中添加阅读付费链接为主题,首先需要开通微信支付商户号,然后创建自定义菜单,并设置跳转到付费链接的逻辑。以下是详细步骤: 注册并开通微信支付商户号 在微信开放平台上注册并开通微信支付商户号。这一步需要营业执照、法…

企业如何识别和满足客户需求的5个要点

随着市场竞争的日益加剧,企业需要更加注重客户需求,以获得持续的发展。而企业在满足客户需求上,则需要遵循一些基本的原则和方法。本文将介绍企业识别和满足客户需求的5个要点。 1、理解客户 企业需要了解客户的需求、想法和行为&#xff0c…

Python 3.12.0 正式版即将发布!

导读Python 3.12.0 发布了第 2 个 RC 版本,也是最后一个 RC。正式版将于 2023 年 10 月 2 日星期一发布。 开发团队表示,进入候选版本阶段后,只接受经过 review 且修复明确错误的代码。RC2 是发现并修复重要问题的最后机会。 从该版本开始&a…

安装nvm包含卸载node及卸载nvm

卸载node 1、在命令行输入where node查看node所在位置,删除node.exe所在的父级文件夹 2、控制面板中程序卸载,卸载node.js 安装nvm 1、安装nvm-setup.exe 2、命令行运行nvm v,如果出现版本号表示安装成功 3、从node官网下载node版本&#…

事件循环——message loop

1 浏览器的进程模型 1.1 进程 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程。 每个应用至少有一个进程,进程之前相互独立,即使要通信,也需要双方同意。比如:qq、微信、王者荣耀进程。 …

电视盒子什么牌子好?花费30天测评盘点超值电视盒子推荐

最近超多网友咨询我不知道电视盒子什么牌子好,为了推荐结果更客观公正,我将最热门的十款电视盒子买回来进行了一个月的深度测评,最终筛选了五款最优秀的电视盒子推荐给大家,不懂电视盒子怎么挑选那这篇文章就不能错过了。 1、泰捷…

3+单基因泛癌+铜死亡纯生信思路

今天给同学们分享一篇3单基因泛癌铜死亡纯生信思路的生信文章“Systematic pan-cancer analysis identifies SLC31A1 as a biomarker in multiple tumor types”,这篇文章于2023年3月27日发表在BMC Med Genomics 期刊上,影响因子为3.622。 溶质载体家族3…

uni-app:实现页面效果2(canvas绘制,根据页面宽度调整元素位置)

效果 代码 <template><view><!-- 车搭配指示器-双显 --><view class"content_position"><view class"content"><view class"SN"><view class"SN_title">设备1</view><view class…