协议栈启动的上层接口

对于Doubango中得sip协议栈,是通过SipStack类粘合上层代码与底层代码的,该类定义在SipStack.h中,实现在SipStack.cxx中。当构造好一个SipStack实例之后,对于底层而言,实际上是创建了一个tsip_stack_t 的实例,这个实例在SipStack类中通过tsip_stack_handle_t *handle字段指向。此时,handle对于上层而言是不透明的,从tsip_stack_handle_t的定义也可以看出:

typedefvoid tsip_stack_handle_t

因此,handle实际上是一个void指针。指向具体的tsip_stack_t实例。实际上,stack的底层实例已经创建好,并且已经设置好了很多字段信息。但是stack仍旧是没有启动的,若要启动协议栈,对于上层代码而言,可以通过SipStack->start()达到此目的。

SipStack->start(),正是提供给上层启动底层协议栈的粘合接口。而该接口仅仅是对底层协议栈启动的真正函数tsip_stack_start(tsip_stack_t *stack)函数的一个封装而已。

底层协议栈的启动--tsip_stack_start(…)

tsip_stack_start(tsip_stack_t *stack)函数主要完成三件事情:

1.     对协议栈运行模式的处理

判断工作模式为服务器模式或者是客户端模式,在默认情况下,Doubango是作为一个客户端软电话的底层运作机制配置的,因此在这种情况下,我们得到的是客户端运行模式。

另外,还要判断网络层协议族和传输层(tcp,udp)类型,默认情况下为IPV4以及UDP。选择一个最合适的本地ip地址(根据目前的网口选择)网口的IP地址最终由getaddrinfo(…)获得。

2.     启动协议栈的sipevent 事件处理线程run(…)

在stack的结构中,有一个TSK_DECLARE_RUNNABLE的宏声明,这个宏实际上在stack的顶端嵌入了一个tsk_runnable_t__runnable__的结构实例,因此,stack可以被安全的强制转化为一个tsk_runnable_t的类型实例,而这就是TSK_RUNNABLE宏的作用。

TSK_RUNNABLE(stack)->objects是一个队列头,传入其中的元素是通用的tsk_list_item_t,而tsk_list_item_t的作用就是将一个需要记录的实例(任何结构的实例)挂接在tsk_list_item_t的void *data 字段。

因此,TSK_RUNNABLE(stack)->objects实际上是一个队列,该队列中挂载的结构实例便是tsip_event_t结构的实例。

Stack的run(…)线程在stack的生存周期内一直在运行,它的作用是从TSK_RUNNABLE(stack)->objects中取出一个tsip_event_t实例,然后通过注册到stack的回调函数,将该sip事件传递到高层的用户代码中。实际上,这里的传递需要穿越粘合层,因为stack中回调函数即stack->callback(…),便是由SipStack类注册的stack_callback(…)函数,该函数的原型如下:

int stack_callback(tsip_event_t*sipevent);

3.     启动协议栈的传输层——tsip_transport_layer

首先,生成一个默认的tsip_transport_t实例,链接如stack的tsip_transport_layer的transports队列。

其次,启动tsip_transport_layer,这里便完成了套接字的生成,端口绑定,若是tcp协议还要完成connect的相关事宜。

到了这里,粘合层的任务便已经完成了,底层的套接口已经启动,可以接受来自对端的sip消息和处理该sip消息了。

doubango(3)--协议栈的启动过程的更多相关文章

  1. 11.Linux启动过程详解

    目录: 本文转载自:http://blog.csdn.net/miss_acha/article/details/50004717 经过对Linux系统有了一定了解和熟悉后,想对其更深层次的东西做进一 ...

  2. CentOS6与CentOS7的启动过程

    Linux启动流程CentOS6的启动流程Systemd概述Systemd初始化进程Systemd目标名称systemd服务管理 linux系统的组成:内核+跟文件系统 内核可实现以下功能:进程管理. ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. [原] KVM 虚拟化原理探究(2)— QEMU启动过程

    KVM 虚拟化原理探究- QEMU启动过程 标签(空格分隔): KVM [TOC] 虚拟机启动过程 第一步,获取到kvm句柄 kvmfd = open("/dev/kvm", O_ ...

  5. Openfire的启动过程与session管理

    说明   本文源码基于Openfire4.0.2.   Openfire的启动       Openfire的启动过程非常的简单,通过一个入口初始化lib目录下的openfire.jar包,并启动一个 ...

  6. 探索 Linux 系统的启动过程

    引言 之所以想到写这些东西,那是因为我确实想让大家也和我一样,把 Linux 桌面系统打造成真真正正日常使用的工具,而不是安装之后试用几把再删掉.我是真的在日常生活和工作中都使用 Linux,比如在 ...

  7. Linux内核启动过程概述

    版权声明:本文原创,转载需声明作者ID和原文链接地址. Hi!大家好,我是CrazyCatJack.今天给大家带来的是Linux内核启动过程概述.希望能够帮助大家更好的理解Linux内核的启动,并且创 ...

  8. SpringMVC启动过程详解(li)

    通过对SpringMVC启动过程的深入研究,期望掌握Java Web容器启动过程:掌握SpringMVC启动过程:了解SpringMVC的配置文件如何配置,为什么要这样配置:掌握SpringMVC是如 ...

  9. Android源码——Activity组件的启动过程

    根Activity启动过程 Launcher启动MainActivity的过程主要分为6个步骤: 一.Launcher向ActivityManagerService发送一个启动MainActivity ...

随机推荐

  1. BNU OJ 51005 BQG's Quadrilateral Bricks

    #include<cstdio> #include<cstring> #include<cmath> #include<vector> #include ...

  2. Java中的局部内部类

    package Smoke; public class Inner { private int num = 3; class Limian{ public void show(){ //内部类可以访问 ...

  3. 移动web开发资源大整合

    移动web开发资源大整合 http://www.cnblogs.com/PeunZhang/p/3407453.html

  4. PHP中对mysql预编译查询语句的一个封装

    原文地址:http://chen-shan.net/?p=474 为了防止sql注入,我们都使用过mysqli这个类,但是每次都需要绑定参数,绑定结果等,比较麻烦,所以可以把这些重复的语句封装成一个函 ...

  5. C++------------typedef 函数指针类型定义

    摘要bycrazyhacking:        typedef 是定义了一种"函数指针"类型,可以再声明很多变量.函数指针的定义是定义了一个变量. int max(int x,i ...

  6. .NET的对象映射工具AutoMapper使用笔记

    AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...

  7. [转] hibernate和ibatis的对比

    以下文章来源于:http://blog.csdn.net/tianya2198622/article/details/3859859     IBATIS: iBATIS一词来源于“internet” ...

  8. CDbConnection failed to open the DB connection: SQLSTATE[28000] [1045] Access denied for user 'root'@'localhost' (using password: YES)

    连接mysql出错:CDbConnection failed to open the DB connection: SQLSTATE[28000] [1045] Access denied for u ...

  9. PHP PSR 代码风格

    FIG组织在制定跟PHP相关规范,简称PSR,PSR旨在通过讨论我们代码项目的共同点以找出一个协作编程的方法. 什么是psr0 强调自动加载的方式 下文描述了若要使用一个通用的自动加载器(autolo ...

  10. 为什么无线信号(RSSI)是负值(转)

    源:为什么无线信号(RSSI)是负值 为什么无线信号(RSSI)是负值 答:其实归根到底为什么接收的无线信号是负值,这样子是不是容易理解多了.因为无线信号多为mW级别,所以对它进行了极化,转化为dBm ...