mosquitto 原始碼分析 (一)核心資料結構
mosquitto 原始碼中核心資料結構分析
一、struct mosquitto (在mosquitto_internel.h中定義)
struct mosquitto 這個結構體用來儲存一個客戶端連線的所有資訊
這個結構體包含了很多成員,我們選取一些重要的成員,在程式碼中標註:
struct mosquitto {
#ifndef WIN32
int sock; /*伺服器程式與該客戶端連線通訊所用的socket描述符*/
# ifndef WITH_BROKER
int sockpairR, sockpairW;
# endif
#else
SOCKET sock;
# ifndef WITH_BROKER
SOCKET sockpairR, sockpairW;
# endif
#endif
enum _mosquitto_protocol protocol;
char *address;/*該客戶端的IP地址 */
char *id;/*該客戶端登陸mosquitto程式時所提供的ID值,該值與其他的客戶端不能重複*/
char *username;/*登入使用者名稱*/
char *password;/*密碼*/
uint16_t keepalive;/*該客戶端需在此時間內向mosquitto伺服器程式傳送一條ping/pong訊息*/
uint16_t last_mid;
enum mosquitto_client_state state;
time_t last_msg_in;/*last_msg_in和last_msg_out用於記錄上次收發訊息的時間*/
time_t last_msg_out;
time_t ping_t;
struct _mosquitto_packet in_packet;
struct _mosquitto_packet *current_out_packet;
struct _mosquitto_packet *out_packet;
struct mosquitto_message *will;
...
bool want_write;
bool want_connect;
#if defined(WITH_THREADING) && !defined(WITH_BROKER)
pthread_mutex_t callback_mutex;
pthread_mutex_t log_callback_mutex;
pthread_mutex_t msgtime_mutex;
pthread_mutex_t out_packet_mutex;
pthread_mutex_t current_out_packet_mutex;
pthread_mutex_t state_mutex;
pthread_mutex_t in_message_mutex;
pthread_mutex_t out_message_mutex;
pthread_t thread_id;
#endif
bool clean_session;
#ifdef WITH_BROKER
bool is_dropping;
bool is_bridge;
struct _mqtt3_bridge *bridge;
struct mosquitto_client_msg *msgs;/*用於暫時儲存發往該context的訊息。 */
struct mosquitto_client_msg *last_msg;
int msg_count;
int msg_count12;
struct _mosquitto_acl_user *acl_list;
struct _mqtt3_listener *listener;
time_t disconnect_t;
struct _mosquitto_packet *out_packet_last;
struct _mosquitto_subhier **subs;
int sub_count;
int pollfd_index;
...
};
二、struct mosquitto_db (定義在mosquitto_broker.h)
struct mosquitto_db 結構體定義了對所有內部資料的統一管理,儲存了所有客戶端,訂閱關係。可以認為是一個資料倉庫。
struct mosquitto_db{
dbid_t last_db_id;
struct _mosquitto_subhier subs;/*訂閱樹的總樹根*/
struct _mosquitto_unpwd *unpwd;
struct _mosquitto_acl_user *acl_list;
struct _mosquitto_acl *acl_patterns;
struct _mosquitto_unpwd *psk_id;
struct mosquitto *contexts_by_id; /*所有的客戶端都在此陣列中儲存*/
struct mosquitto *contexts_by_sock;
struct mosquitto *contexts_for_free;
#ifdef WITH_BRIDGE
struct mosquitto **bridges;
#endif
struct _clientid_index_hash *clientid_index_hash;
struct mosquitto_msg_store *msg_store;
struct mosquitto_msg_store_load *msg_store_load;
#ifdef WITH_BRIDGE
int bridge_count;
#endif
int msg_store_count;
struct mqtt3_config *config; /*儲存配置資訊*/
int persistence_changes;
struct _mosquitto_auth_plugin auth_plugin;
#ifdef WITH_SYS_TREE
int subscription_count;
int retained_count;
#endif
struct mosquitto *ll_for_free;
};
三、struct _mosquitto_subhier(定義在mosquitto_broker.h)
用來儲存訂閱樹的所有節點,mosquitto中對訂閱樹採用孩子-兄弟連結串列法的方式進行儲存
struct _mosquitto_subhier {
struct _mosquitto_subhier *children;/*第一個孩子節點*/
struct _mosquitto_subhier *next;/*指向該節點的下一個兄弟節點*/
struct _mosquitto_subleaf *subs;/*指向訂閱列表*/
char *topic;/*訂閱主題*/
struct mosquitto_msg_store *retained;
};
四、struct _mosquitto_subleaf (定義在mosquitto_broker.h)
對某一topic的所有訂閱者被組織成一個訂閱列表,該訂閱列表是一個雙向連結串列,連結串列的每個節點都儲存有一個訂閱者
struct _mosquitto_subleaf {
struct _mosquitto_subleaf *prev;/*前指標*/
struct _mosquitto_subleaf *next;/*後指標*/
struct mosquitto *context;/*表示一個訂閱客戶端*/
int qos;/* Qos Level */
};
五、struct mqtt3_config (定義在mosquitto_broker.h)
儲存mosquitto的所有配置資訊,mosquitto程式在啟動時將初始化該結構體並從配置檔案中讀取配置資訊保存於該結構體變數內。
以上暫且先列出一些核心資料結構,其他資料結構用到時在分析。下篇結合使用方法來分析main程式。
相關推薦
mosquitto 原始碼分析 (一)核心資料結構
mosquitto 原始碼中核心資料結構分析 一、struct mosquitto (在mosquitto_internel.h中定義) struct mosquitto 這個結構體用來儲存一個客戶端連線的所有資訊 這個結構體包含了很多成員,我們選取一些重要
mosquitto原始碼分析(一)
關於mqtt、mosquito的技術交流,可入群:221779856 本文由逍遙子撰寫,轉發請標註原址:http://blog.csdn.net/houjixin/article/details/21461225一、 Mosquitto簡介mosquitto是一款實現了訊息
Weka演算法Classifier-tree-J48原始碼分析(一)演算法和基本資料結構
大概一年沒打理部落格了,重新拿起筆不知道該從哪裡寫起,想來想去就從最近手頭用的Weka寫起吧。 Weka為一個Java基礎上的機器學習工具,上手簡單,並提供圖形化介面,提供如分類、聚類、頻繁項挖掘等工具,本篇文章主要寫一下分類器演算法中的J48演算法及其實現。 一、演算
Flume NG原始碼分析(一)基於靜態properties檔案的配置模組
日誌收集是網際網路公司的一個重要服務,Flume NG是Apache的頂級專案,是分散式日誌收集服務的一個開源實現,具有良好的擴充套件性,與其他很多開源元件可以無縫整合。搜了一圈發現介紹Flume NG的文章有不少,但是深入分析Flume NG原始碼的卻沒有。準備寫一個系列分析一下Flume NG的
GCC原始碼分析(一)——介紹與安裝
原文連結:http://blog.csdn.net/sonicling/article/details/6702031 上半年一直在做有關GCC和LD的專案,到現在還沒做完。最近幾天程式設計的那臺電腦壞了,所以趁此間隙寫一點相關的分析和
Glide原始碼分析(一)從用法來看之with方法
繼續啃原始碼,用過Glide的人,肯定都覺得它好好用,我們一般只需要幾行程式碼,就可以達到我們想要的效果,可以在這個背後是什麼呢?就需要我們來看了。 我一般看原始碼,我喜歡先從用法來看,然後一步一步的再細扣,所以就先從用法來看Glide的整體流程。 用過Glide的人,用下面這段
zigbee 之ZStack-2.5.1a原始碼分析(三)無線資料傳送和接收
前面說過SampleApp_Init和SampleApp_ProcessEvent是我們重點關注的函式,接下來分析無線傳送和接收相關的程式碼: 在SampleApp_ProcessEvent函式中: if ( events & SYS_EVENT_MSG ) { &nbs
zigbee 之ZStack-2.5.1a原始碼分析(一)
先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務
Docker Client原始碼分析(一)
主要內容: Docker Client在Docker中的定位,以及Docker Client原始碼的初步分析。 本文選取Docker拆分為DockerCE(社群版)和DockerEE(企業版)之後的Docker-CE的第一個穩定版本v17.06.0-ce。 https://github.com/docker
Hibernate使用及原始碼分析(一)
Hibernate使用及原始碼分析(一) 本篇文章主要通過hibernate初級使用分析一下原始碼,只是給初學者一點小小的建議,不喜勿噴,謝謝! hibernate環境搭建 簡單使用 原始碼走讀 一 hibernate環境搭建 這裡直接
SpringCloud原始碼分析(一)--客戶端搭建
一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通過配置來設定其不向自己註冊,和不去檢索服務的功能,保持了其作為服務註冊中心的相對的功能單一性。 二、pom檔案
Vue原始碼分析(一):入口檔案
Vue原始碼分析(一):入口檔案 首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git 這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具
okhttp原始碼分析(一)——基本流程(超詳細)
1.okhttp原始碼分析(一)——基本流程(超詳細) 2.okhttp原始碼分析(二)——RetryAndFollowUpInterceptor過濾器 3.okhttp原始碼分析(三)——CacheInterceptor過濾器 4.okhttp原始碼分析(四)——Conn
spring事務管理原始碼分析(一)配置和事務增強代理的生成流程
在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣
Android系統播放器MediaPlayer原始碼分析(一)
前言 對於MediaPlayer播放器的原始碼分析內容相對來說比較多,會從Java->JNI->C/C++慢慢分析,後面會慢慢更新。另外,部落格只作為自己學習記錄的一種方式,對於其他的不過多的評論。 MediaPlayerDemo public class MainA
Android7.1 [Camera] Camera Hal 原始碼分析(一)
原始碼平臺:rk3399 命令列ls看下原始碼的結構 hardware/rockchip/camera/CameraHal: lib目錄 原始碼的檔案看起來有點多,我們看看Android.mk檔案, 這些檔案最終編譯成camera.rk30bo
Cat原始碼分析(一):Client端
前言 cat的Client端所做的工作就是收集埋點資訊,將埋點資訊處理成messageTree,放到傳送佇列中,在啟動另一個執行緒,非同步消費佇列,進行訊息的傳送。 本文涉及到三個內容: 客戶端初始化:做了哪些準備工作 message的建立過程 客戶端的傳
laravel框架原始碼分析(一)自動載入
一、前言 使用php已有好幾年,laravel的使用也是有好長時間,但是一直對於框架原始碼的理解不深,原因很多,歸根到底還是php基礎不紮實,所以原始碼看起來也比較吃力。最近有時間,所以開啟第5、6遍的框架原始碼探索之旅,前面幾次都是看了一些就放棄,希望這次能夠看完。每一次看原始碼都會有新的收穫,因為框
github上hamsternz/FPGA_DisplayPort 的VHDL原始碼分析(一)
原始碼來源於https://github.com/hamsternz/FPGA_DisplayPort。由於我也是第一次接觸這個介面,所以文中肯定有我理解錯誤的地方,懇請指正。要看懂程式碼首先還是要對協議有一定了解。所以我做的原始碼分析中會和協議結合起來。 激勵檔案test_source_800
vue-element-admin原始碼分析(一)
這兩天看花褲衩大大的手摸手系列,使用vue+element+vuex+axios實現了一個後臺模板(專案地址),在閱讀原始碼的過程中收益匪淺,以下做一些筆記。(由於是學習大大專案的思想,所以略去了很多大大的程式碼)。 這裡只是做一個登陸頁面,然後能提交資料給後臺