Mosquitto-1.5.4源码分析,PUBLISH的实现及函数跳转关系
客户端向服务器发送数据包(packet)时,首先将数据包放到改发送队列中,并不真实发送数据,而是发送数据就绪信号,等待loop的函数db__message_write根据网络连接情况来处理发送请求;该队列为单链表存储结构,每次有新数据包需要发送时,将新数据包插入到链表尾部;真正发送数据时从链表头部开始发送数据包。
阶段1、准备好需要发送的数据包,参见截图1的上半部分的单步断点处,非常关键,inflight_msgs就是在此处赋值的。
截图1的下半部分,每一个函数的跳转关系一目了然。
截图1
阶段2、在loop.c的函数db__message_write实现真正的发送,该函数反复在判断inflight_msgs是否为空。不为空表示有待发送的数据包。
截图2