osip和mysql_osip2和eXosip2协议

本文详细介绍了oSIP2和eXosIP2这两个开源SIP协议栈,oSIP2专注于SIP底层解析,提供高效的语法和过程分析,而eXosIP2在其基础上进行了封装,增加了呼叫、注册等功能,便于实际应用。文章还剖析了osip2协议栈的三个组成部分,并展示了eXosip2的初始化过程及其重要回调函数。
摘要由CSDN通过智能技术生成

http://blog.csdn.net/flyhawk007j2me/article/details/6830586

Osip2是一个开放源代码的sip协议栈,是开源代码中不多使用C语言写的协议栈之一,它具有短小简洁的特点,专注于sip底层解析使得它的效率比较高

eXosip2是Osip2的一个扩展协议集,它部分封装了Osip2协议栈,使得它更容易被使用。

exosip2增加了call、dialog、registration、subscription等过程的解析,使得实用性更强。

//========================================================================================================================

osip2协议栈分为三部分:sip协议的语法分析,sip协议的过程分析和协议栈框架。

1>>sip协议的语法分析

主要是osipparser2部分,目前支持RFC3261和RFC3265定义的sip协议消息,

包括INVITE、ACK、OPTIONS、CANCEL、BYE、SUBSCRIBE、NOTIFY、MESSAGE、REFER和INFO。不支持RFC3262定义的PRACK。

遵循RFC3264关于SDP的offer/answer模式。带有SDP的语法分析。

支持MD5加解密算法。支持Authorization、www_authenticate和proxy_authenticate

2>>sip协议的过程分析

主要是osip2部分,基于RFC3261、RFC3264和RFC3265的sip协议描述过程,围绕transaction这一层来实现sip的解析。

Transaction是指一个发送方和接收方的交互过程,由请求和应答组成。请求分为Invite类型和Non-Invite类型。应答分为响应型的应答和确认型的应答。

响应型的应答是指这个应答仅代表对方收到请求。请求经过处理后都必须返回确认型的应答。响应型的应答有1xx,确认型的应答包括2xx、3xx、4xx、5xx和6xx。

一个transaction由一个请求和一个或多个响应型应答、一个确认型应答组成。

3>>sip协议框架

主要有三部分:底层套接字接收/发送,模块间通信管道,上层调用api接口。

Osip2并不实现底层套接字的接收/发送,由eXosip2实现;

上层调用的api接口大致有两类:sip协议的调用接口和sdp协议的调用接口。

EXosip封装了大部分的sip协议调用接口

//********************************************************************************************************************************//

exosip2协议栈的分析

exosip是osip2协议的封装和调用。它实现了作为单个sip终端的大部分功能,如register、call、subscription等

exsiop使用udpsocket套接字实现底层sip协议的接受和奉送,并且封装了sip消息的解释器。

参考:http://blog.163.com/haidiniao@126/blog/static/117538091200961093456878/?latestBlog

eXosip_init()是eXosip的初始化函数,我们来看看它的内部实现:

首行是定义的 osip_t *osip,这在oSIP的官方手册里我们看到,所有使用oSIP的程序都要在最开始处声明一个osip_t的指针,并使用 osip_init(&osip)来初始化这个指针,销毁这个资源使用osip_release(osip)即可。

我们可以在代码中看到很多OSIP_TRACE,这是调试输出宏调用了函数osip_trace,可以用ENABLE_TRACE宏来打开调试以方便我们开发调试。

其它就是很多的eXosip_t的全局变量eXosip的一些初始化操作,包括最上面的memset (&eXosip, 0, sizeof (eXosip))完全清空和下面的类似eXosip.user_agent = osip_strdup ("eXosip/" EXOSIP_VERSION)的exosip变量的一些初始值设置,其中有一个eXosip.j_stop_ua = 0应该是一个状态机开关,后面可以看到很多代码检测这个变量来决定是否继续流程处理,默认置成了0表示现在exosip的处理流程是就绪的,即ua是 not stop的。

osip_set_application_context (osip, &eXosip)是比较有意思的,它让下面的eXosip_set_callbacks (osip)给osip设置大量的回调函数时,能让osip能访问到eXosip这个全局变量中设置的大量程序运行时交互的信息,相当于我们在VC下开启一个线程时,给线程传入的一个void指针指向我们的MFC应用程序的当前dialog对象实例,可以用void *osip_get_application_context (osip_t * osip)这个函数来取出指针来使用,不过好象exosip中并没有用到它,可能是留给个人自已扩展的吧:)

osip_set_cb_send_message (osip, &cb_snd_message) SIP消息发送回调函数

这个函数可能是最重要的回调函数之一,消息发送,包括请求消息和回应消息,一般情况下,状态机的状态就是由它控制的,发起一个消息初始化一个状态机,回应一个消息对状态机修改,终结消息发送结束状态机……

//==================================================================================

exosip协议示例:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值