osip2协议栈原理分析以及总结

内容发布更新时间 : 2025/4/14 6:48:09星期一 下面是文章的全部内容请认真阅读。

3.6 osip_message_t

可以看到这是一个非常大的结构体。该结构体用来保存与sip 消息相关的大部分信息。一般都是一个消息头对应其中的一项。比如,像sip 头数据中的call_id、from、to、via、等等,都能在该结构体中找到。在程序中,接收到的sip消息都是以紧凑的方式放在buffer中的,解析器模块的功能就是将其进行解析分类,放到这个结构体的具体对应项上,这样便于在程序中使用。同时,如果需要发送数据时,解析器会根据该结构体中的信息重新将sip信息以紧凑方式放到buffer中供发送模块使用。简单来说,sip协议中定义的各个头,在接收发送处理中都是一个接一个在内存中存放的,而在osip中对其的使用是按照上面的结构体来的,我们在程序中不再需要移动指针从buffer中来找各个sip头数据。

3.7 osip_event

这个结构体用来表示事务上的事件。Type 指出事件的类型,transactionid 指出事务的id,sip 指向上面介绍的osip_message 结构体,也就是事件对应的sip 消息。

4、osip协议栈工作原理

4.1 系统初始化过程

在OSIP工作之前,必须先初始化,主要有以下几个部分: (1)系统资源申请,包括资源和链表的处理 函数:osip_init()

(2)设置系统CALLBACK函数

Callback 函数有很多,但是主要可以分为以下四类: ? ? ? ?

用于发送sip 消息的网络接口。这通过osip 结构体的cb_send_message 函数指针指向。

当一个sip 事务被terminate 的时候调用的回调函数。这由osip 结构体的kill_callbacks 数组保存

当消息通过网络接口发送失败的时候调用的回调函数。这由osip 结构体的 tp_error_callbacks 数组保存。

sip 事务处理过程中需要通知用户的回调函数。这部分由osip 结构体的

msg_callbacks 数组保存。

上面的回调函数中,有一些是必须设置的,比如第一项,有些则是可选的,比如第四项中的部分回调函数。对于可选的回调函数,简单的处理可以是不做任何处理,或者仅仅打印通知信息。

osip_set_cb_send_message ();

//系统的信令发送函数,在这个函数中,要完成信令包的向外发送功能。 osip_set_kill_transaction_callback ();

5

//设置四个状态机下消息传输失败的处理函数。 osip_set_message_callback ();

//设置各种状态机下各种事件发生后用户的回调

(3)打开接收远端消息接收通道

打开通道就是保证远方的消息能够顺利的被本地接收到,然后交给SIP CORE处理,它包括以下几个步骤

? Step1:监听端口

? 打开SIP端口SOCKET,然后监听此端口,如5060。需要注意的是,SIP支持TCP

和UDP两种方式,SIP首先UDP方式。 ? Step2:解析消息

? 接收到消息后,调用osip_parse函数,来完成对消息包的解析。这个函数完成后,

消息就从普通信令消息分解成了OSIP2自己可以理解的消息事件。osip_parse函数在src\\osipparser2下。

? Step3:将消息送给SIP CORE处理 ? 解析后的消息,系统调用osip_find_transaction_and_add_event函数,把消息发

送给和此消息相关的处理事物(或者说ses

>>閻忕偞娲栫槐鎴﹀礂閵婏附鐎�<<
12@gma联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4 ceshi