China Open source community
站内导航:
站内排行前50热点文章

精华文章  GDB调试精粹及使用实例
普通文章  STL中map用法详解
精华文章  负载均衡软件比较(Hapr...
普通文章  头文件的重复引用
普通文章  递归函数的调用过程
普通文章  TCP三次握手/四次挥手详解
普通文章  epoll的实现原理
普通文章  贪心策略的理论基础——...
普通文章  BMH算法原理与实现(模...
普通文章  http请求的详细过程
普通文章  DP动态规划
普通文章  GNU LD用法
普通文章  排列组合与回溯算法
普通文章  Linux内核中的红黑树
精华文章  linux下使用minicom的几...
普通文章  Linux socket编程之套接字
精华文章  Android线程模型
精华文章  enum类型的本质
普通文章  Java开源Html解析类库
普通文章  linux源代码包(.tar.g...
普通文章  L.A.M.P配置过程
普通文章  linux设置环境变量的方法
普通文章  python的memcache和jso...
普通文章  应用程序二进制接口---ABI
普通文章  memcached server LRU ...
普通文章  gcc编译过程概述
普通文章  Java多线程实现简单实例
普通文章  android核心模块及相关...
普通文章  linux内核编译问题
普通文章  brk和sbrk详述
普通文章  Python程序员常用的IDE...
普通文章  C/C++程序员常见面试题...
普通文章  优化C语言代码(程序员必...
普通文章  Unix操作系统的历史演变
普通文章  发行版发布:CentOS 5.4
普通文章  模版函数指针,C++委托...
普通文章  在windows中构建gtk开发...
普通文章  在ubuntu9.10下安装QT4...
普通文章  关于Qvariant类--万能的...
普通文章  Debian sudo 设置
普通文章  i++循环与i--循环的执行...
普通文章  busybox1.15.x 交叉编译
普通文章  python非贪婪,多行匹配...
普通文章  cscope使用简介
普通文章  关于僵死进程zombie
普通文章  [翻译]Django初窥
普通文章  函数指针传递和全局指针...
普通文章  Android Porting Exper...
普通文章  判断链表是否存在环并找...
普通文章  递归思想的妙用

 
 
 
当前位置: 首页 >> 网络协议与安全 >> 开源的SIP协议库PJSIP
 
 

开源的SIP协议库PJSIP

作者:      来源:zz     发表时间:2008-06-12     浏览次数:      字号:    

本文档的Copyleft归popy所有,使用GPL发布,可以自由拷贝,转载,转载时请保持文档的完整性,
严禁用于任何商业用途。
gtalk: mypopy@gmail.com
来源:barrypopy.cublog.cn

如果你对SIP/VoIP技术感兴趣,哪希望你不要错过:),如果你对写出堪称优美的Code感兴趣
,那么你也不可错过:)

这期间我想分析一下一个实际的协议栈的设计到实现的相关技术,算是自己的一个学习经
历记录.

最初选择这个库做分析的原因很简单,文档齐全:),其它良好的特征则是慢慢发现的:)

www.pjsip.org

1. PJSIP简介

PJSIP的实现是为了能在嵌入式设备上高效实现SIP/VOIP.其主要特征包括:
1).极具移植性.(Extremely portable)
当前可支持平台包括:
* Win32/x86 (Win95/98/ME, NT/2000/XP/2003, mingw).
    * arm, WinCE and Windows Mobile.
    * Linux/x86, (user mode and as kernel module(!)).
    * Linux/alpha
    * Solaris/ultra.
    * MacOS X/powerpc
    * RTEMS (x86 and powerpc).

正移植到:
    * Symbian OS
   
    2).非常小的足印.(Very small footprint)
    官方宣称编译后的库<150Kb,我在PC上编译后加上strip后大概173Kb,这对于嵌入
    式设备,是个好消息:)
   
    3).高性能.(High performance)
    这点我们后面可以看看是否如作者宣称的:)
   
    4).支持众多的特征.(Many features)
    这点可以从http://www.pjsip.org/sip_media_features.htm#sip_features
看出.


   
    5).充足的SIP文档.(Extensive SIP documentation)
    这是我最初选择该库的原因,当然不是最终的原因,最终的原因是它的code:)
   
2. PJSIP的组成.

其实说是PJSIP不是特别贴切,这个库实际上是几个部分组成的.
1).PJSIP - Open Source SIP Stack[开源的SIP协议栈]

2).PJMEDIA - Open Source Media Stack[开源的媒体栈]

3).PJNATH - Open Source NAT Traversal Helper Library[开源的NAT-T辅助库]

4).PJLIB-UTIL - Auxiliary Library[辅助工具库]

5).PJLIB - Ultra Portable Base Framework Library[基础框架库]

而在最上层库的目录分为:(可以使用tree -d -L 1 查看)

$TOP/build [包含Makefile]
$TOP/build.symbian [针对symbian的Makefile]
$TOP/pjlib [参考上面]
$TOP/pjlib-util [参考上面]
$TOP/pjnath [参考上面]
$TOP/pjmedia [参考上面]
$TOP/pjsip [参考上面]
$TOP/pjsip-apps
$TOP/third_party

而在每个子目录,可以看到分为:
bin [编译后产生的二进制文件]
build [Makefile]
build/output
build/wince-evc4
docs [doxygen的文档,用doxygen docs/doxygen.cfg产生]
include [头文件]
lib [编译后产生的库]
src [源代码]
3. PJLIB简介

要理解好PJSIP,就不得不先说说PJLIB,PJLIB算的上是这个库中最基础的库,正是这个
库的优美实现,才让PJSIP变得如此优越。

PJLIB提供了一系列特征,这是我们下面分析的重点,涉及到:
1).非动态内存分配[No Dynamic Memory Allocations]
实现了内存池,获取内存是从与分配的内存池中获取,高性能程序多会自己构造内存池
,后面我们会解释该内存池的使用以及基本的原理。根据作者的比较,是常规的 malloc(
)/free()函数的30倍。

2).OS抽象[Operating System Abstraction]
实现OS抽象的根本原因在与可移植性,毋庸置疑:).
涉及到:
a).线程[Threads.]
b).线程本地存储[Thread Local Storage.]
c).互斥[Mutexes.]
d).信号灯[Semaphores.]
e).原子变量[Atomic Variables.]
f).临届区[Critical sections.]
g).锁对象[Lock Objects.]
h).事件对象[Event Object.]
i).时间管理[Time Data Type and Manipulation.]
j).高解析的时间戳[High Resolution Timestamp.]
等等,这些我们后面分析代码时一一看来:)

3).低层的网络相关IO[Low-Level Network I/O]
    这涉及到:
    a).Socket抽象[Socket Abstraction.]
    b).网络地址解析[Network Address Resolution.]
    c).实现针对Socket的select API[Socket select() API.]
   
4).时间管理[Timer Management]
这主要涉及到两个部分,一个时定时器的管理,还有就是时间解析的精度(举例说来,就
是能精确到哪个时间等级,比如 POSIX sleep(),就只能以秒为单位,而使用select()则可
以实现毫秒级别的计时)

5).各种数据结构[Various Data Structures]
主要有:
a).针对字符串的操作[String Operations]
b).数组辅助[Array helper]
c).Hash表[Hash Tabl]
d).链表[Linked List]
e).红黑平衡树[Red/Black Balanced Tree]

6).异常处理[Exception Construct]
使用的是TRY/CATCH,知道C++/JAVA之类面向对象语言的人看过会宛而一笑:)

7).LOG机制[Logging Facility]
很显然,一个良好的程序,好的LOG机制不可少。这能很方便的让你去调试程序,对此我
是深有体会,任何时候,不要忘记“好的程序,是架构出来的;而能跑的程序,是调试出
来的:)”

8).随机数以及GUID的产生[Random and GUID Generation]
GUID指的是"globally unique identifier",只是一个标识而已,比如说你的省份证,
算的上是一个GUID,当然,准确说来是“china unique identifier”:).

看了这么多的特征列举,是不是很完备,的确。

[1] [2]

编辑 webmaster

 
 
 
评论
 
 
发表
 
姓名: QQ:
性别: MSN:
E-mail: 主页:
评分: 1 2 3 4 5
评论内容:
验证码:
  
  • 请遵守《互联网电子公告服务管理规定》及中华人民共和国其他各项有关法律法规。
  • 严禁发表危害国家安全、损害国家利益、破坏民族团结、破坏国家宗教政策、破坏社会稳定、侮辱、诽谤、教唆、淫秽等内容的评论 。
  • 用户需对自己在使用本站服务过程中的行为承担法律责任(直接或间接导致的)。
  • 本站管理员有权保留或删除评论内容。
  • 评论内容只代表网友个人观点,与本网站立场无关。
  •  
    中国源码网 - www.YuanMa.org - 中国 开放源代码+编程 社区