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> < ...
最新文章
- Windows Server 2008 R2安装子域控制器
- 使用JPA获取Oracle中的日期字段丢失时分秒
- 即墨php,即墨php培训
- 如何让PHP以root权限执行系统命令
- tensorflow之过拟合问题实战
- 支架预压弹性变形值计算_复杂环境下大跨度箱梁整体支架法现浇安全要点
- [SpringBoot2]web场景_SpringBoot2_SpringMVC自动配置概览
- java 与 区别
- 乐优商城项目实战系列笔记1-项目搭建
- 破解"中国裁判文书网"App加密过程
- Maui Shell 来了,开启 Linux 桌面新时代!
- w10系统打不开服务器共享打印机,共享打印机拒绝访问怎么办?Win10打印机无法共享的解决办法...
- Package zip is not available, but is referred to by another package.
- 用户运营实战:打造流失用户召回体系
- Windows7+CentOS双系统同一硬盘
- AI 与合成生物学「联姻」的五大挑战:技术、数据、算法、评估与社会学
- OpenAI-ChatGPT最新官方接口《审核机制》全网最详细中英文实用指南和教程,助你零基础快速轻松掌握全新技术(七)(附源码)
- J2ee学习流程(zz)
- 2018函授英语计算机统考,大学英语b网络统考
- 推荐3本Python高分书籍,居家旅行必备神器!
热门文章
- spring整合atomikos实现分布式事务的方法示例_分布式事务一:基于数据库原生分布式事务方案实现...
- java nio 强制关闭_Java NIO服务器:远程主机强迫关闭了一个现有的连接
- oracle怎么定时执行存储过程6,Oracle中如何定时调用存储过程
- mysql5.7.14_mysql 5.7.14 下载安装配置方法图文教程
- C++非递归解决汉诺塔问题
- 机器视觉用c还是python_机器视觉_opencv-python环境搭建
- bootstrap 按钮样式单选效果_【20201117】Bootstrap前端框架学习笔记
- sql int 比较_分享 21 个编写 SQL 的好习惯
- java 8 两个list_java集合框架综述
- 内核aio_linux内核aio功能