自顶向下与自底向上

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

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

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

自顶向下-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. 上传数据插件 Easy Populate 遇到问题 ?langer=remove

    批量上传,出现如下错误提示: ADD NEW PRODUCT FAILED! – Model: no200 – SQL error. Check Easy Populate error log in ...

  2. HDU 5547 暴力

    Sudoku Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Subm ...

  3. hibetnateTemplate常用方法

    一.hibetnateTemplate常用方法 1.delete(Object entity) 删除指定的持久化实例在程序中一般先用    Assert.notNull和 Assert.isTrue断 ...

  4. ural1471 Distance in the Tree

    Distance in the Tree Time limit: 1.0 secondMemory limit: 64 MB A weighted tree is given. You must fi ...

  5. mysql的数据类型int、bigint、smallint 和 tinyint取值范围

    使用整数数据的精确数字数据类型.   bigint   从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字 ...

  6. WebRequestManager对象的使用

    WebRequestManager可以喝WebRequest对象一起使用. WebRequestManager对象的add_completedRequest方法,可以用来处理所有WebRequest对 ...

  7. Linux开发IDE打造

    一直以来都是在windows下做开发的,微软提供的IDE  vs开发起来确实快捷高效,接触linux也很久了通常都是使用vim进行一些基础文件的编译,现在突然要转到linux做开发还是不太适应的,网上 ...

  8. 用简单的http抓包来实现微信公众网页如何模拟登录

    一.准备工具: 系统:XP 浏览器:IE8 抓包工具:HttpWatch(它可以查看url请求的数据包) 二.抓包思路: 浏览器上的任何获取数据的方式都符合http协议的请求,只要发送符合要求的数据就 ...

  9. 写一个程序,统计自己C语言共写了多少行代码。ver2.00

    概要 完成一个程序,作用是统计一个文件夹下面所有文件的代码行数.输入是一个文件夹的绝对路径,输出是代码行数.所以此程序的新特点有两个: 统计某一文件夹下的所有文件: 可以任意指定本机硬盘上任何位置的某 ...

  10. SQLite高级:一库建多表,封装类

    package eoe.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; ...