本文主要介绍一下Mosquitto中用到的比较重要的数据结构,为之后的流程处理讲解奠定基础。为了清晰,结构体展示时只保留重要成员。
一、mosquitto_db
struct mosquitto_db{
/*主题树的根结点*/
struct _mosquitto_subhier subs;
/*id:context映射的Hash表首节点,通过该成员去遍历Hash表*/
struct mosquitto *contexts_by_id;
/*sock:context映射的Hash表首节点,通过该成员去遍历Hash表*/
struct mosquitto *contexts_by_sock;
/*存储消息的链表*/
struct mosquitto_msg_store *msg_store;
/*服务器的配置*/
struct mqtt3_config *config;
/*由于断开连接等需要释放的context存放的链表*/
struct mosquitto *ll_for_free;
};
mosquitto_db可谓是mosquitto最核心的结构体,没有之一。它维护着服务器配置
、主题树
、客户端句柄
、接收的消息列表
。其中为了查找方便,建立了通过客户端id来查找客户端句柄的Hash表和通过客户端socket连接描述符查找客户端句柄的Hash表;将连接断开的客户端句柄先存放在ll_for_free
链表中,待到合适时统一释放。
二、mosquitto
mosquitto 是客户端连接句柄,包含着客户端相关信息。
struct mosquitto{
/*socket连接描述符*/
mosq_sock_t sock;
/*客户端使用的协议版本号*/