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设置成未定义。


相关文章
|
4月前
|
消息中间件 C语言 RocketMQ
消息队列 MQ操作报错合集之出现"Connection reset by peer"的错误,该如何处理
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
3月前
|
消息中间件 Java 开发工具
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
【Azure 事件中心】Spring Cloud Stream Event Hubs Binder 发送Event Hub消息遇见 Spec. Rule 1.3 - onSubscribe, onNext, onError and onComplete signaled to a Subscriber MUST be signaled serially 异常
|
3月前
|
Go
Go事件管理器:简单实现
Go事件管理器:简单实现
|
6月前
uni-app 79聊天类封装(十四)-处理接收消息
uni-app 79聊天类封装(十四)-处理接收消息
31 2
|
前端开发
ant design中默认回调加入参数
ant design中默认回调加入参数
70 0
|
Python
python和zmq包实现在sever和client之间进行信息传递
python和zmq包实现在sever和client之间进行信息传递
279 0
|
存储
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
355 0
Mosquitto-1.5.4源码分析,主题订阅的数据结构及SUBSCRIBE的函数跳转关系
|
缓存
【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )
【EventBus】EventBus 源码解析 ( 注册订阅者 | 订阅方法 | 查找订阅方法 )
121 0
|
Linux
Mosquitto-1.5.0开始源码新增了epoll机制,如何编译实现?
Mosquitto-1.5.0开始源码新增了epoll机制,如何编译实现?
258 0