内容发布更新时间 : 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