FreeSwitch系列之接收消息处理流程

接收消息处理流程

tport_wakeup_pri在profile clone线程中被触发。

1、接收消息

2、解析消息成结构体msg

3、找到leg去处理请求

4、创建irq

5、执行leg的回调函数,转到nua_handle层去处理。

6、找到method。

7、执行三部曲:init-->preprocess-->report

tport_wakeup_pri
  =>tport_recv_event
    =>tport_recv_data(self);
    =>tport_parse(self, self->tp_pre_framed ? 1 : !again, self->tp_rtime);
      =>n = msg_extract(msg); 
      =>tport_deliver(self, msg, next, self->tp_comp, now);
        =>tport_base_deliver
        =>(tp)->tp_master->mr_tpac->tpac_recv((tp)->tp_master->mr_stack, (tp), (msg), (tp)->tp_magic, (now))
          =>agent_recv_message(nta_agent_t *agent, tport_t *tport, msg_t *msg, sip_via_t *tport_via, su_time_t now)
            =>agent_recv_request(agent, msg, sip, tport);
              =>agent_check_request_via(agent, msg, sip, sip->sip_via, tport);
              =>irq = incoming_find(agent, sip, sip->sip_via,..);
              =>leg = agent->sa_default_leg
              =>leg_recv(leg, msg, sip, tport);
                =>irq = incoming_create(agent, msg, sip, tport, tag)
                =>status = incoming_callback(leg, irq, sip);
                  =>leg->leg_callback(leg->leg_magic, leg, irq, sip);
                  =>nua_stack_process_request(nua_handle_t *nh, nta_leg_t *leg, nta_incoming_t *irq, sip_t const *sip);
                    =>sm = nua_server_methods[method];
                    =>sm->sm_init(sr)
                    =>sm->sm_preprocess(sr)
                    =>nua_server_report(sr)

流程图

以注册消息为例:

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值