自顶向下与自底向上

软件设计的两种方法不过于自顶向下与自底向上。

对于自顶向下而言,先设计好用户接口,再往下延伸至各个功能块的具体实现。而对于自底向上而言,自然是有了设计好的各个功能代码块,再将这些功能代码块拼接成具体的用户接口,然而实际的软件实践中,这两种方法是同时展开的,因为无论单独实施哪一种,都是有所缺陷,会令人陷入某种困境。

设计软件如此,那么在分析一款软件的时候,结合自顶向下与自底向上的方法,必然是更好的一种捷径,对软件的分析能更通透和彻底。

自顶向下-Doubango协议栈的设计方式

Doubango是一个sip协议客户端软件,通过学习它,能更好地掌握sip协议栈,不仅如此,在学习Doubango的过程中,对于其他软件的设计问题,例如怎样设计才能使各个软件模块达到高聚类低耦合的设计原则,各个模块间的接口如何才能很好的衔接,都在Doubango的设计中有一定的体现。对于一个设计很好的软件系统,功能模块的作用必然是明晰的,聚类的,与其他模块间的功能是能达到最低限度依赖的。

SipStack类

在Doubango的最顶层,对于协议栈的抽象描述便是这个SipStack类。它有两方面的作用:

1)        提供对于协议栈的抽象。

2)        底层代码与高层代码的粘合层。

SipStack 类定义在SipStack.cxx中,其接口描述定义在SipStack.h中。

分析一个类,最好的方法是:首先读其私有字段,这代表了它的内部机理;其次读其接口,这代表了它的对外功能,也就是用户可以用它来做什么。

SipStack的私有字段有四个:

a)        SipCallback*callback;

这个字段由上层代码提供,也就是由用户提供,在创建一个SipStack协议时,用户必须提供一个SipCallBack类的实例,传入SipStack的构造函数:

SipStack(SipCallback*callback,

const char* realm_uri, const char* impi_uri, const char* impu_uri);

b)        DDebugCallback*debugCallback;

这个字段功调试所用。

c)        tsip_stack_handle_t*handle;

这个字段代表了底层对于协议栈真正的描述。在SipStack类被构造时,会根据传入的参数真正地创建一个在底层运行着的协议栈。

d)        static unsignedcount;

代表了该协议栈的实用计数。

由这四个字段不难看出,SipStack类是作为一个粘合层而存在的,它是高层和底层的粘合剂,高层通过SipCallBack注册到SipStack类,而SipStack类又通过tsip_stack_handle_t实例关联底层,当SipStack在其构造函数中创建tsip_stack_handle_t实例时,会将本粘合层的回调函数intstack_callback(consttsip_event_t*sipevent)注册在tsip_stack_handle_t的对应字段中,这样,当底层的sipevent到来时,会通过回调机制层层传递到应用程序的最顶层。

doubango(1)--从协议栈结构说起的更多相关文章

  1. doubango(4)--SIP协议栈传输层的启动

    协议栈的默认传输结构 对于一个刚启动的协议栈来说,它需要有一个传输层,支持若干的传输结点.每一个传输结点对应于一个端口,若采用TCP连接,一个传输结点就针对于一个点到点的连接,这个连接负责sip信令的 ...

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

    tsip_stack_handle_t 实例 1.        tsip_stack_handle_t的创建 在底层,真正运转的协议栈结构式tsip_stack_handle_t的一个实例,它的创建 ...

  3. doubango(5)--SIP协议栈传输层的启动

    SIP协议的INVITE消息发起流程 当通过sip协议发起一个会话时,需要通过invite消息实现该流程.而SIP协议是一个基于事务的协议,每一个sip会话的都是通过sip部件间的一系列消息来完成的. ...

  4. 由PPPOE看Linux网络协议栈的实现

    http://www.cnblogs.com/zmkeil/archive/2013/05/01/3053545.html 这个标题起得比较纠结,之前熟知的PPPOE是作为PPP协议的底层载体,而实际 ...

  5. TCP/IP协议栈在Linux内核中的运行时序分析

    网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...

  6. netfilter-在内核态操作网络数据包

    一.概述                                                    netfilter是自2.4内核的一个数据包过滤框架.可以过滤数据包,网络地址和端口转换 ...

  7. Linux内核--网络栈实现分析(一)--网络栈初始化

    本文分析基于内核Linux Kernel 1.2.13 原创作品,转载请标明http://blog.csdn.net/yming0221/article/details/7488828 更多请看专栏, ...

  8. iostat的深入理解

    问题背景 iostat -xdm 1 通常用来查看机器磁盘IO的性能. 我们一般会有个经验值,比如,ioutil要小于80%, svctm要小于2ms. 前几天碰到一个奇怪的现象:有一台SSD机器,磁 ...

  9. Linux内核--网络栈实现分析(一)--网络栈初始化--转

    转载地址 http://blog.csdn.net/yming0221/article/details/7488828 作者:闫明 本文分析基于内核Linux Kernel 1.2.13 以后的系列博 ...

随机推荐

  1. opencart配置mail服务

    编辑mail配置,如下图所示 如果sever开启了SSL,则端口改成465 在Contant Us页面留言,发送成功则配置完成

  2. Android音频系统之AudioPolicyService

    地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...

  3. Ibatis教程

    Ibatis教程 |字号     转自:http://blog.csdn.net/lhminjava/article/details/1871136 ibatis 开发指南ibatis Quick S ...

  4. Selenium-Grid工作方式

    http://blog.csdn.net/five3/article/details/9428655 Selenium-Grid工作方式 标签: selenium-grid2webdriversele ...

  5. MulticastSocket绑定端口的问题

    该文章由 Binkery 发布于 Binkery技术博客 http://www.binkery.com 如转载请注明出处,该文章的链接地址为 http://www.binkery.com/archiv ...

  6. phpstrom 2016.2 注册服务器地址

    无意中发现的,亲测可用:http://114.215.133.70:41017

  7. Python核心编程第二版(中文).pdf 目录整理

    python核心编程目录 Chapter1:欢迎来到python世界!-页码:7 1.1什么是python 1.2起源  :罗萨姆1989底创建python 1.3特点 1.3.1高级 1.3.2面向 ...

  8. mysql面试

    第一方面:30种mysql优化sql语句查询的方法 避免全表扫描: 1.where 及 order by 上建立索引.2.避免在 where 子句中使用!=或<>操作符3. select ...

  9. Objective C HMAC-MD5

    - (NSString*) HMACWithSecret:(NSString*) secret andString:(NSString *)str { unsigned long encode = C ...

  10. ARM的启动代码(1):介绍(转)

    源:ARM的启动代码(1):介绍 很多朋友搞嵌入式,写起代码来一点问题没有,到最后上板子调试的时候,挂了.究其原因,还是对芯片的启动地址.启动方式.bootloader和操作系统的衔接出了问题.今天就 ...