• doubango(2)--底层协议栈结构分析


    tsip_stack_handle_t 实例

    1.        tsip_stack_handle_t的创建

    在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建时机为SipStack类在构造时,也就是说,当上层不管用何种方式触发一个SipStack的创建动作时。在上层,SipStack会被继续抽象封装,这种封装有可能是封装成为一个java类,一个C#类,但是都不重要,重要的是,这些高层代码类必然关联了一个粘合层的SipStack实例。当粘合层(SipStack.cxx)中得SipStack被创建时,其构造函数会被调用。在它的构造函数类,会调用底层函数tsip_stack_create(…) 创建协议栈结构实例。

    2.        tsip_stack_handle_t 创建过程

    A.     记录通过可变参数传入的一系列变量到stack(tsip_stack_handle_t实例)中。包括服务器地址(假设为:192.168.1.101),本机用户名(假设为:1002),sip-uri(sip:1002@192.168.1.101)。这些都将以字符窜形式记录到对应的stack字段中。

    需要注意的是:由于传入的字符串可能是托管资源,因此,这里我们没有必要去显式释放它们。释放他们应该是高层代码的责任(有可能通过托管释放,也有可能需要手动释放)。设置为tsip_stack_set(tsip_stack_handle_t * stack,…)这是一个通过可变参数进行结构类实例设置的函数,设置时通过type-value的形势传递参数,也就是在一系列的可变参数中,其中一对可能是(type: tsip_pname_realm, value:”192.168.1.101”),在该函数内,对于字符串有一个拷贝动作。也就是说,记录的是stack自己管理的内存区。

    B.     记录粘合层SipStack提供的回调函数到stack->callback字段,以提供sipevent到来时的回调。在上一节中,可以看到SipStack类提供的回调函数为:

    Int stack_callback(tsip_event_t *);

    C.     创建一个基于stack的全局timer管理结构,用来处理该协议栈中各种需要定时器功能的模块,在后面我们可以看到,对于一个dialog的四种事物:tsip_trsaction_ict,

    tsip_trsaction_ist, tsip_trsaction_nict, tsip_trsaction_nist,都需要有定时重传的机制,这里仅仅是创建了这个定时管理结构,还没有启动该定时线程,定时线程稍后会在start stack 的时候启动,定时线程拥有两个队列:收集队列和分发队列。

    D.     创建一个sessions的队列,用来管理基于该stack的各种session。

    E.      最后创建三个层,可以说,sip协议是层次分明的,上层提供给下一层的回调,下一层将sip消息处理后传递给上一层处理,这是典型的网络处理方式。

    三个层次为:

    struct tsip_dialog_layer_s *layer_dialog;

              struct tsip_transac_layer_s *layer_transac;

    struct tsip_transport_layer_s *layer_transport;

    分别是对话层,事物层和传输层,具体关系以后分析。

    3.        对于tsip_stack_t(tsip_stack_handle_t 是其别名) 结构而言,定义也是明晰的。

       /* 3GPP IMS/LTE stack (forinternal use). only tsip_stack_handle_t should be visible. */

    typedef struct tsip_stack_s

    {

         TSK_DECLARE_RUNNABLE;//用于标志该结构是一个可以运行run()线程的结构

        

         tsk_bool_t timer_mgr_started;   //全局定时器启动标志

         tsk_bool_t started;             //协议栈启动标志

         tsip_stack_callback_f callback;//记录粘合层的回调函数

          

              

         tsip_uris_L_tpaths;

         tsip_uris_L_tservice_routes;

         tsip_uris_L_tassociated_uris;

         /* DNS context */

         tnet_dns_ctx_t *dns_ctx;

        

         /* DHCP context */

         /* QoS */

         /* Internals. */

         //tsk_timer_manager_handle_t* timer_mgr;

         tsip_timers_t timers;

         tsip_ssessions_L_t *ssessions;    //会话队列

         tsk_params_L_t *headers;          //记录的各种键值对

         const voiduserdata;             //上层用户私有数据,一般记录粘合层SipStack实例地址

         /* Layers */

        

    }

    tsip_stack_t;

  • 相关阅读:
    746. 使用最小花费爬楼梯
    1283. 使结果不超过阈值的最小除数
    307. 区域和检索
    303. 区域和检索
    474. 一和零
    600. 不含连续1的非负整数
    命名规范【转】
    .NET中RabbitMq的使用
    C#中json字符串的序列化和反序列化
    c#发送post请求(带参数)
  • 原文地址:https://www.cnblogs.com/fuland/p/3654841.html
Copyright © 2020-2023  润新知