Mosquitto-1.5.4源码分析,PUBLISH的实现及函数跳转关系

简介: Mosquitto-1.5.4源码分析,PUBLISH的实现及函数跳转关系

客户端向服务器发送数据包(packet)时,首先将数据包放到改发送队列中,并不真实发送数据,而是发送数据就绪信号,等待loop事件循环调用的函数db__message_write根据网络连接情况来处理发送请求;该队列为单链表存储结构,每次有新数据包需要发送时,将新数据包插入到链表尾部;真正发送数据时从链表头部开始发送数据包。


阶段1、准备好需要发送的数据包,参见截图1的上半部分的单步断点处,非常关键,inflight_msgs就是在此处赋值的。


截图1的下半部分,每一个函数的跳转关系一目了然。


image.png


截图1



阶段2、在loop.c的事件循环里面,一直在调用函数db__message_write,通过它实现真正的发送,


/* Local bridges never time out in this fashion. */

   if(!(context->keepalive)

     || context->bridge

     || now - context->last_msg_in <= (time_t)(context->keepalive)*3/2){

                   if(db__message_write(db, context) == MOSQ_ERR_SUCCESS){ //firecat,real_send_publish

该函数体在database.c定义,它反复在判断inflight_msgs是否为空。不为空表示有待发送的数据包。



image.png

截图2



个人建议:


在单步调试,查看业务主题消息流程时,建议把系统主题的消息屏蔽掉。方法如下:


1、/src/mosquitto.c,第294行,代码注释掉


#ifdef WITH_SYS_TREE

   //sys_tree__init(&int_db);//firecat,SYS,"$SYS/broker/#"

#endif


2、/src/loop.c,第204行,代码注释掉


if(db->config->sys_interval > 0){undefined

      //sys_tree__update(db, db->config->sys_interval, start_time);//firecat,SYS,"$SYS/broker/#"

}


或者干脆一点,在CMakeLists直接把宏WITH_SYS_TREE设置成未定义。


相关文章
|
28天前
在 Jenkinsfile 中配置邮件通知的示例代码
在 Jenkinsfile 中配置邮件通知的示例代码
|
2月前
|
缓存 JavaScript
vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布
vue2基础组件通信案例练习:把案例Todo-list改成使用消息订阅与发布
17 3
|
4月前
|
Go
Go事件管理器:简单实现
Go事件管理器:简单实现
|
消息中间件 存储 API
事件,消息,消息处理函数,第一个图形界面程序(附带官方解释链接)
事件,消息,消息处理函数,第一个图形界面程序(附带官方解释链接)
|
Java Maven
java实现发送接收邮件的功能(详细代码步骤和jar包)
可以通过java代码发送A邮箱发送到B邮箱。
428 0
java实现发送接收邮件的功能(详细代码步骤和jar包)
|
Android开发
广播的简单使用
广播的简单使用
|
前端开发 JavaScript Android开发
Jetpack MVVM 常见错误用法(四) 使用 LiveData/StateFlow 发送 Event
在 MVVM 架构中,使用 LiveData 或者 StateFlow 很适合用来向 UI 侧发送更新后的状态,但是用来发送事件就不妥了
1026 1
Jetpack MVVM 常见错误用法(四)  使用 LiveData/StateFlow 发送 Event
|
存储
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
375 0
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
|
缓存
【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )
【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )
124 0
|
Linux
Mosquitto-1.5.0开始源码新增了epoll机制,如何编译实现?
Mosquitto-1.5.0开始源码新增了epoll机制,如何编译实现?
266 0