mosquitto源码分析(二)
本文由逍遥子撰写,转发请标注原址:
http://write.blog.csdn.net/postedit/21462005
一、 Mosquito的数据结构
1) struct mosquito
结构体struct mosquito主要用于保存一个客户端连接的所有信息,例如用户名、密码、用户ID、向该客户端发送的消息等,其定义为:
struct mosquitto {
int sock;
char*address;
char *id;
char*username;
char*password;
uint16_tkeepalive;
time_tlast_msg_in;
time_tlast_msg_out;
struct mosquitto_client_msg *msgs;
…
}
上面列举了该结构体部分重要成员,其中sock表示mosquitto服务器程序与该客户端连接通信所用的socket描述符;address表示该客户端的IP地址;id是该客户端登陆mosquitto程序时所提供的ID值,该值与其他的客户端不能重复;成员username和password用于记录客户端登陆时所提供的用户名和密码;keepalive是该客户端需在此时间内向mosquitto服务器程序发送一条ping/pong消息。参数last_msg_in和last_msg_out用于记录上次收发消息的时间;参数struct mosquitto_client_msg*msgs用于暂时存储发往该context的消息。
2) struct mosquitto_db
结构体struct mosquitto_db是mosquitto对所有内部数据的统一管理结构,可以认为是其内部的一个内存数据库。它保存了所有的客户端,所有客户端的订阅关系等等,其定义形式为:
struct mosquitto_db{
dbid_tlast_db_id;
struct_mosquitto_subhier subs;
struct mosquitto**contexts;
struct_clientid_index_hash *clientid_index_hash;
intcontext_count;
structmosquitto_msg_store *msg_store;
intmsg_store_count;
structmqtt3_config *config;
intsubscription_count;
……
};
上述结构体声明中,结构体成员struct _mosquitto_subhier subs保存了订阅树的总树根,mosquitto中对所有的topic都在该订阅树中维护,客户端的订阅关系也在该订阅树中维护;结构体成员struct mosquitto **contexts可理解为一个用于存放所有客户端变量(类型为struct mosquitto)地址的数组,mosquitto程序中,所有的客户端都在此数组中保存;成员int context_count用于保存数组contexts的大小,该值也是当前mosquitto程序中维持的所有客户端的数目;成员结构体struct _clientid_index_hash*clientid_index_hash用于保存一个hash表,该hash表可通过客户端的ID快速找到该客户端在数组contexts中的索引;结构体成员struct mqtt3_config*config用于保存mosquitto的所有配置信息;
3)struct_mosquitto_subhier
数据结构struct _mosquitto_subhier是用于保存订阅树的节点(包括叶子节点和中间节点),mosquitto中对订阅树采用孩子-兄弟链表法的方式进行存储,该存储方式主要借助与数据结构struct _mosquitto_subhier来完成,该数据结构的定义为:
struct _mosquitto_subhier {
struct_mosquitto_subhier *children;
struct_mosquitto_subhier *next;
struct_mosquitto_subleaf *subs;
char*topic;
structmosquitto_msg_store *retained;
};
成员说明:
children :该成员指针指向同结构的第一个孩子节点;
next:该成员指针指向该节点的下一个兄弟节点;
subs:该成员指向订阅列表;
topic:该节点对应的topic片段;
3) struct _mosquitto_subleaf
在mosquitto程序中,对某一topic的所有订阅者被组织成一个订阅列表,该订阅列表是一个双向链表,链表的每个节点都保存有一个订阅者,该链表的节点即是:struct _mosquitto_subleaf,定义形式为:
struct _mosquitto_subleaf {
struct_mosquitto_subleaf *prev;
struct_mosquitto_subleaf *next;
structmosquitto *context;
int qos;
};
其中成员struct mosquitto *context表示一个订阅客户端,prev和next表示其前一个节点和后一个节点。
6)structmqtt3_config
结构体struct mqtt3_config用于保存mosquitto的所有配置信息,mosquitto程序在启动时将初始化该结构体并从配置文件中读取配置信息保存于该结构体变量内。
mosquitto源码分析(二)相关推荐
- mosquitto源码分析
mosquitto源码分析 一.mosquitto简介 二.主要目录 三.客户端源码 结构体 重要函数 1.mosquitto_lib_init 2.mosquitto_new 3.mosquitto ...
- 【Android 事件分发】ItemTouchHelper 源码分析 ( OnItemTouchListener 事件监听器源码分析 二 )
Android 事件分发 系列文章目录 [Android 事件分发]事件分发源码分析 ( 驱动层通过中断传递事件 | WindowManagerService 向 View 层传递事件 ) [Andr ...
- SpringBoot源码分析(二)之自动装配demo
SpringBoot源码分析(二)之自动装配demo 文章目录 SpringBoot源码分析(二)之自动装配demo 前言 一.创建RedissonTemplate的Maven服务 二.创建测试服务 ...
- gSOAP 源码分析(二)
gSOAP 源码分析(二) 2012-5-24 flyfish 一 gSOAP XML介绍 Xml的全称是EXtensible Markup Language.可扩展标记语言.仅仅是一个纯文本.适合用 ...
- Android Q 10.1 KeyMaster源码分析(二) - 各家方案的实现
写在之前 这两篇文章是我2021年3月初看KeyMaster的笔记,本来打算等分析完KeyMaster和KeyStore以后再一起做成一系列贴出来,后来KeyStore的分析中断了,这一系列的文章就变 ...
- 【投屏】Scrcpy源码分析二(Client篇-连接阶段)
Scrcpy源码分析系列 [投屏]Scrcpy源码分析一(编译篇) [投屏]Scrcpy源码分析二(Client篇-连接阶段) [投屏]Scrcpy源码分析三(Client篇-投屏阶段) [投屏]Sc ...
- Nouveau源码分析(二):Nouveau结构体的基本框架
Nouveau源码分析(二) 在讨论Nouveau对Nvidia设备的初始化前,我准备先说一下Nouveau结构体的基本框架 Nouveau的很多结构体都可以看作是C++中的类,之间有很多相似的东西, ...
- ENS最新合约源码分析二
ENS(以太坊域名服务)智能合约源码分析二 0.简介 本次分享直接使用线上实际注册流程来分析最新注册以太坊域名的相关代码.本次主要分析最新的关于普通域名注册合约和普通域名迁移合约,短域名竞拍合约不 ...
- 【转】ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...
- Vue.js 源码分析(二十三) 指令篇 v-show指令详解
v-show的作用是将表达式值转换为布尔值,根据该布尔值的真假来显示/隐藏切换元素,它是通过切换元素的display这个css属性值来实现的,例如: <!DOCTYPE html> < ...
最新文章
- tensorflow函数API总结
- unix_timestamp 时间戳函数用法(hive)
- PHP动物书总结14-17
- Scala基础教程(一):简介、环境安装
- Libra教程之:Libra protocol的逻辑数据模型
- angularjs启动项目报ERROR in AppModule is not an NgModule解决方法
- 安卓学习笔记08:常用布局 - 线性布局
- [Usaco2007 Demo]City skyline
- mouseover和mouseenter的区别?
- 第十代晨风机器人,第十代机器人说明(软件+群主+成员使用说明)
- Spark 名词解释
- 导教班,我的职业续航加油站
- 磁盘阵列服务器上创建虚拟机,UNRAID下虚拟机搭建单机游戏教程
- 谈谈“五级工程师和职业发展”的思考
- 基于高分辨率影像城市绿地信息提取_[转]ENVI支持下利用高分辨率影像城市绿地信息提取方案...
- 1到1000的奇数和偶数和
- function* 生成器函数
- java 系统资源不足_[InteliJ IDEA] 系统资源不足
- python sort 多级排序_python sort、sorted高级排序技巧
- vs点击方法跳不到对于的地方_【阿司足球】今天带来一场欧国联的比赛,一场焦点战 西班牙VS德国...
热门文章
- CentOS Linux 7绑定静态IP方法
- Sublime text 2按Ctrl+`无法调出console的可能问题
- hypertrm超级终端_win7电脑怎么添加windows超级终端
- python多线程详解_Python多线程详解
- quartz框架_定时任务调度框架Quartz
- python控制结构实验结果分析_实验1_Python语法及控制结构
- java 处理unicode_Java与Unicode
- css样式有行内式还有什么,在行内式CSS样式中,属性和值的书写规范与CSS样式规则不相同...
- 幼儿园ppt计算机考试试题,全国“xx杯”计算机应用基础类说课大赛优秀作品:幼儿园里的各类朋友说课课件.ppt...
- android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用