mosquitto源码分析(六)

时间:2022-01-14 19:53:39

 本文由逍遥子撰写,转发请标注原址:

http://write.blog.csdn.net/postedit/21465011

一、  Mosquito的辅助功能介绍

Mosquitto代码的辅助功能主要包括:log输出功能、配置参数管理功能和内存封装的功能,这三个功能虽不是mosquitto的核心模块,但是却在其源码实现中经常遇到,它们的实现给mosquitto的代码开发带来了很大的方便。

4.1、log输出功能

Mosquitto日志输出功能的实现代码主要在文件/ mosquitto-1.2/src/logging.c中。Mosquitto的log模块具备以下功能:日志分等级输出、日志的多平台输出、日志对各种参数的格式化输出;

mosquitto的日志模块初始化由函数mqtt3_log_init完成,该函数主要完成对日志输出位置以及日志输出等级两个参数的设置。函数mqtt3_log_close完成日志模块的关闭功能。日志模块的输出由函数_mosquitto_log_printf完成,该函数的声明形式为:

int _mosquitto_log_printf(struct mosquitto *mosq, int priority,const char *fmt, ...)

  其中第一个参数struct mosquitto *mosq表示某客户端连接所对应的上下文信息,该参数可以为空;第二个参数int priority表示日志的优先级,在mosquitto的配置文件mosquitto.conf中将会配置日志的输出等级,如果传给函数的日志等级低于配置文件中的等级配置,该条日志将不被输出。另外,该函为一可变参数的函数,在使用过程中可以根据需要将参数进行格式化输出。例如下一条日志输出语句:

_mosquitto_log_printf(NULL,MOSQ_LOG_NOTICE, "Client %s disconnected.", client_id);

在该条日志输出语句中,将保存在client_id中的客户端ID格式化到字符串"Client %s disconnected."中作为本条日志输出的内容,本条日志输出的等级为MOSQ_LOG_NOTICE。

4.2、配置参数管理

Mosquitto参数配置功能的实现代码主要在文件mosquitto-1.2/src/conf.c中,配置文件保存路径为:mosquitto-1.2/ mosquitto.conf,在mosquitto程序中主要由结构体structmqtt3_config保存从配置文件中读取的各参数值。Mosquitto的配置参数管理功能主要包括对配置文件的读取和解析、对用户输入参数的解析以及对配置文件结构体的管理三部分

Mosquitto对外提供的操作接口均以“mqtt3_config_”开头,共有以下四个:

(1)   mqtt3_config_init

该函数的声明为:

void mqtt3_config_init(struct mqtt3_config *config)

它主要完成对参数config的各结构体成员的初始化工作。

(2)   mqtt3_config_cleanup

该函数的声明为:

void mqtt3_config_cleanup(struct mqtt3_config *config)

它主要完成对参数config的各成员的清除、释放等操作。

(3)   mqtt3_config_read

该函数的声明为:

int mqtt3_config_read(struct mqtt3_config *config, bool reload)

它主要完成从配置文件中读取各配置参数到结构体config中,具体的配置文件读取工作由函数_config_read_file完成。

(4)   mqtt3_config_parse_args

该函数的声明为:

int mqtt3_config_parse_args(struct mqtt3_config *config, intargc, char *argv[])

它主要完成对用户输出参数的解析工作。

Mosquitto的配置文件内部共提供对整形、布尔类型,字符串三种类型的解析函数,这三个解析函数只共内部调用,分别是:_conf_parse_bool、_conf_parse_int、_conf_parse_string。

4.3、内存操作的封装

Mosquitto对内存操作的封装代码主要在文件mosquitto-1.2/src/memory_mosq.c中实现,共实现了对常用的内存申请与释放相关的系统调用函数,共有:_mosquitto_calloc函数是对系统函数calloc的封装,_mosquitto_malloc函数对系统函数malloc的封装,_mosquitto_realloc函数对系统函数realloc的封装,_mosquitto_free函数对系统函数free的封装,_mosquitto_strdup函数对系统函数strdup的封装。在上述封装函数中如果文件中定义了宏REAL_WITH_MEMORY_TRACKING,则这些封装函数只是对系统函数进行封装,不做任何额外操作。如果定义了REAL_WITH_MEMORY_TRACKING宏,则会在内存申请和释放时分别记录所申请或释放内存的大小。