opendds之GUID理解


在opendds的调试日志中大量充斥各种entity的guid,如下所示:

(838182|838209) DataLink::release_reservations() - releasing association local: 0103bab5.84e0eba6.ca269681.01000004(b02bd8da) <--> with remote 0103bab5.84e0eba6.a56d6aff.01000003(453a5921).

 如上所示,标红部分所示的就是GUID,刚开始看到也是很头疼,经过分析源码终于搞明白了这个GUID的含义下面进行详细的介绍。

首先需要搞清楚的是就是GUID一共有16个字节,其中前12个字节的含义是GUID的前缀;后4个字节表示的是entity的类型和id。具体含义如下图所示:

上面的图非常清晰的将各个字节的含义介绍清楚了。文字介绍如下所示:

  1. 前2个字节表示的厂商,目前代码中固定是0103
  2. 从第3个字节开始的6个字节是网卡的mac地址
  3. 从第9个字节开始的2个字节是应用程序进程pid的低16位(2个字节)
  4. 从第11个字节的2个字节的一个随机数,目前我也不太理解这个随机数的意义,仅知道这个是随机数,有知道的可以给我留言告诉我,感激不尽
  5. 从第13个字节开始的3个字节标识的本地entity(实体)的id,这个id从1开始,依次递增。
  6. 第16个字节的函数含义是entity(实体)类型

entity类型的枚举定义如下所示:

enum EntityKind {
  KIND_UNKNOWN, ///< ENTITYKIND_USER_UNKNOWN and ENTITYKIND_BUILTIN_UNKNOWN
  KIND_PARTICIPANT, ///< ENTITYKIND_BUILTIN_PARTICIPANT
  KIND_USER_WRITER, ///< ENTITYKIND_USER_WRITER_WITH_KEY and ENTITYKIND_USER_WRITER_NO_KEY
  KIND_USER_READER, ///< ENTITYKIND_USER_READER_WITH_KEY and ENTITYKIND_USER_READER_NO_KEY
  KIND_USER_TOPIC, ///< ENTITYKIND_OPENDDS_TOPIC
  KIND_BUILTIN_WRITER, ///< ENTITYKIND_BUILTIN_WRITER_WITH_KEY and ENTITYKIND_USER_WRITER_NO_KEY
  KIND_BUILTIN_READER, ///< ENTITYKIND_BUILTIN_READER_WITH_KEY and ENTITYKIND_USER_READER_NO_KEY
  KIND_BUILTIN_TOPIC, ///< ENTITYKIND_BUILTIN_TOPIC
  KIND_PUBLISHER, ///< Publisher (OpenDDS-specific)
  KIND_SUBSCRIBER, ///< Subscriber (OpenDDS-specific)
  KIND_USER ///< For creating custom GUIDs for things that are not DDS entities (OpenDDS-specific)
};

guid赋值函数源码如下所示:

void
GuidGenerator::populate(DCPS::GUID_t &container)
{
  container.guidPrefix[0] = DCPS::VENDORID_OCI[0];
  container.guidPrefix[1] = DCPS::VENDORID_OCI[1];

  const ACE_UINT16 count = getCount();
  ACE_OS::memcpy(&container.guidPrefix[2], node_id_, NODE_ID_SIZE);
  container.guidPrefix[8] = static_cast<CORBA::Octet>(pid_ >> 8);
  container.guidPrefix[9] = static_cast<CORBA::Octet>(pid_ & 0xFF);
  container.guidPrefix[10] = static_cast<CORBA::Octet>(count >> 8);
  container.guidPrefix[11] = static_cast<CORBA::Octet>(count & 0xFF);
}

opendds 随机数生成源码实现:

ACE_UINT16
GuidGenerator::getCount(bool doIncrement)
{
  ACE_Guard<ACE_Thread_Mutex> guard(counter_lock_);
  if (doIncrement) {
    ++counter_;
  }
  return counter_;
}

GuidGenerator::GuidGenerator()
  : pid_(ACE_OS::getpid())
{
  unsigned seed = static_cast<unsigned>(SystemTimePoint::now().value().usec() + reinterpret_cast<size_t>(this));

  if (pid_ == -1) {
    pid_ = static_cast<pid_t>(ACE_OS::rand_r(&seed));
  }

#ifdef ACE_HAS_CPP11
  std::mt19937 generator(seed);
  std::uniform_int_distribution<ACE_UINT16> distribution(0, ACE_UINT16_MAX);
  counter_ = distribution(generator);
#else
  counter_ = static_cast<ACE_UINT16>(ACE_OS::rand_r(&seed));
#endif

  ACE_OS::macaddr_node_t macaddress;
  const int result = ACE_OS::getmacaddress(&macaddress);

#ifndef ACE_HAS_IOS
  if (-1 != result) {
    ACE_OS::memcpy(node_id_, macaddress.node, NODE_ID_SIZE);
  } else {
    for (int i = 0; i < NODE_ID_SIZE; ++i) {
      node_id_[i] = static_cast<unsigned char>(ACE_OS::rand_r(&seed));
    }
  }
#else
  // iOS has non-unique MAC addresses
  ACE_UNUSED_ARG(result);

  for (int i = 0; i < NODE_ID_SIZE; ++i) {
    node_id_[i] = static_cast<unsigned char>(ACE_OS::rand_r(&seed));
  }
#endif /* ACE_HAS_IOS */
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自定义错误页面在Spring Boot中的实现

引言 在SpringBoot中&#xff0c;常用的异常处理有两种&#xff1a;一种是 BasicErrorController&#xff0c;另一种是 ControllerAdvice。BasicErrorController 用于处理非Controller抛出的异常&#xff0c;而ControllerAdvice 用于处理Controller抛出的异常&#xff0c;对于…

2024 年 7 个 Web 前端开发趋势

希腊哲学家赫拉克利特认为&#xff0c;变化是生命中唯一不变的东西。这句话适用于我们的个人生活、行业和职业领域。 尤其是前端开发领域&#xff0c;新技术、开发趋势、库和框架不断涌现&#xff0c;变化并不陌生。最近发生的一些事件正在改变开发人员构建网站和 Web 应用的方…

【前端web入门第一天】01 开发环境、HTML基本语法文本标签

文章目录: 1. 准备开发环境 1.1 vs Code基本使用 2.HTML文本标签 2.1 标签语法2.2 HTML基本骨架2.3 标签的关系2.4 注释2.5 标题标签2.6 段落标签2.7 换行与水平线标签2.8 文本格式化标签 1. 准备开发环境 VSCode与谷歌浏览器离线版,安装包评论区自提. VSCode默认安装位置:C…

动态IP与静态IP有何区别?怎么使用选择?

动态代理IP和静态代理IP在跨境业务中具有非常广泛的实用性&#xff0c;但仍然有非常多小白选手并不清楚什么场景适合用哪一类IP&#xff0c;哪一中代理IP类型更适合你&#xff1f;其实他们各有其优点和缺点&#xff0c;为了使您的网络营销、社媒推广、跨境电商运营、网络抓取尽…

【AI视野·今日NLP 自然语言处理论文速览 第七十五期】Thu, 11 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 11 Jan 2024 Totally 36 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Leveraging Print Debugging to Improve Code Generation in Large Language Models Authors Xueyu Hu, Kun K…

跟着我学Python进阶篇:04. 错误和异常

往期文章 跟着我学Python基础篇&#xff1a;01.初露端倪 跟着我学Python基础篇&#xff1a;02.数字与字符串编程 跟着我学Python基础篇&#xff1a;03.选择结构 跟着我学Python基础篇&#xff1a;04.循环 跟着我学Python基础篇&#xff1a;05.函数 跟着我学Python基础篇&#…

03 SpringBoot实战 -微头条之首页门户模块(跳转某页面自动展示所有信息+根据hid查询文章全文并用乐观锁修改阅读量)

1.1 自动展示所有信息 需求描述: 进入新闻首页portal/findAllType, 自动返回所有栏目名称和id 接口描述 url地址&#xff1a;portal/findAllTypes 请求方式&#xff1a;get 请求参数&#xff1a;无 响应数据&#xff1a; 成功 {"code":"200","mes…

SPE单对以太网线束测试

根据IEC63171-1&#xff0c;严格执行此标准&#xff0c;进行测试&#xff1a; 两端压接的LC端子&#xff0c;有人会有疑问为什么以上测试参数的DC LOOP电阻&#xff0c;那么高&#xff0c;今天就此来探讨一下&#xff1a; 1&#xff0c;没有2m的线做基准测试&#xff1b; 2&a…

Win11在某些时候想要关闭windows安全中心应该怎么做,安装navicat事例

比如在安装navicat时&#xff0c;需要注册&#xff0c;注册机被删&#xff0c;就是windows安全中心干的&#xff0c;所以要想办法&#xff0c;不让他把注册机删掉&#xff0c;那么这里有一个比较巧妙的办法&#xff0c;就使用排除项&#xff0c;关闭 实时保护&#xff0c; 添…

机器学习核心算法

目录 逻辑回归 算法原理 决策树 决策树算法概述 树的组成 决策树的训练与测试 切分特征 衡量标准--熵 信息增益 决策树构造实例 连续值问题解决 预剪枝方法 分类与回归问题解决 决策树解决分类问题步骤 决策树解决回归问题步骤 决策树代码实例 集成算法 Baggi…

泡泡玛特旗下IP亮相2024米兰时装周 LABUBU等化身时尚观察员​

2024年1月14日&#xff0c;在意大利米兰时装周上&#xff0c;泡泡玛特旗下IP THE MONSTERS成员LABUBU、ZIMOMO惊艳亮相PRONOUNCE珀琅汐2024秋冬大秀现场&#xff0c;作为时尚观察员的LABUBU和ZIMOMO以其独特的潮玩形象打动了顶级时尚圈。 据了解&#xff0c;泡泡玛特和PRONOUNC…

纯前端实现上一条下一条切换,并实现跨页切换上一条下一条

1.开发遇到了新的需求&#xff1a;再进入到视频播放界面&#xff0c;需要支持可以点击上一条下一条按钮&#xff0c;实现数据切换的功能 2.功能开发的理解 需要考虑到以上的需求&#xff0c; 1.由于视频的入口不一致&#xff0c;要根据入口的不同&#xff0c;实现不同的上一条…

手动加好友太麻烦,想要自动加好友?

问&#xff1a;手上有一批客户数据&#xff0c;但每天手动添加很费时&#xff0c;而且还是多个微信号同时加好友&#xff0c;很容易出现数据重复加怕出错。有没有什么方法可以自动加好友呀&#xff0c;能支持多个号一起设置自动加好友&#xff0c;还可以设置定时启动任务操作的…

Linux docker 容器安装superset全部过程(superset docker版本)

解释一波 Apache Superset是一款由Python语言为主开发的开源时髦数据探索分析以及可视化的报表平台&#xff1b;她支持丰富的数据源&#xff0c;且拥有多姿多彩的可视化图表选择。 官网 &#xff1a;https://superset.apache.org/github &#xff1a;https://github.com/apache…

夜莺监控发布 v6.7 版本,推送部分商业版功能

熟悉夜莺的小伙伴都知道夜莺分为开源版、专业版、企业版&#xff0c;三个版本良性发展。近期夜莺团队发布了 v6.7 版本&#xff0c;把机器Metadata管理功能推送到了开源版&#xff0c;下面是该功能的简单介绍。 如上图&#xff0c;机器列表页面的机器标识部分&#xff0c;加了超…

RAG和AGI以及AIGC,你知道多少?

RAG&#xff08;Retrieval-Augmented Generation&#xff09;&#xff1a; RAG是一种模型架构&#xff0c;结合了检索&#xff08;retrieval&#xff09;和生成&#xff08;generation&#xff09;的方法。它使用检索模块从大规模的知识库中检索相关信息&#xff0c;然后使用生…

Linux:gcc的相关知识

目录 gcc的翻译&#xff08;编译&#xff09;过程&#xff1a; 预处理&#xff1a; 条件编译&#xff1a; 编译&#xff1a; 汇编&链接&#xff1a; 什么是链接&#xff1f; 安装静态库&#xff1a; 静态库的使用&#xff1a; 动态静态的对比&#xff1a; 优缺对比…

类和对象(友元、运算符重载、继承、多态)---C++

类和对象 4.友元4.1全局函数做友元4.2类做友元4.3成员函数做友元 5.运算符重载5.1 加号运算符重载5.1.1成员函数实现运算符重载5.1.2全局函数实现运算符重载 5.2 左移运算符重载5.2.1全局函数实现运算符重载5.2.2成员函数实现运算符重载 5.3 递增/递减运算符重载5.3.1 前置5.3.…

软件产品为什么要测试才能上线?测试可以发现所有bug吗?

在现如今信息时代&#xff0c;软件产品已经成为人们生活中不可或缺的一部分。无论是在工作中还是在娱乐休闲时&#xff0c;我们都需要依赖各种软件来完成各种任务。然而&#xff0c;你是否注意到了身边的软件产品都是经过严格的测试才能上线的呢?那么为什么软件产品必须要经过…

操作系统【OS】Ch2 进程同步与互斥机制

进程同步与互斥机制1&#xff1a;硬件和软件方法 硬件方法 也称为低级方法、元方法 不能实现让权等待 中断屏蔽 使用开/关中断指令实现简单高效只适用于单处理机只适用于操作系统内核进程【因为关中断的权力不能交给用户】 TestAndSet 实现简单适用于多处理机不满足让权等待…