第一范文网 - 专业文章范例文档资料分享平台

exosip2协议栈原理分析以及总结 - 图文

来源:用户分享 时间:2025/5/22 5:07:41 本文由闁诲孩绋忛崐鏇犵紦妤e啫绫嶉柣妯哄暱婢癸拷 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

application_contexgt 指针指向exosip,也就是二者相互指向。

4.1.3 调用eXosip_set_callbacks 设置osip 的回调函数,所以回调函数都是exosip 自己实现。

4.1.4 调用jpipe 创建通信用的pipe,之前已经说了,对于windows 平台,是通过socket 接口模拟实现的。

4.1.5 初始化其上的事务和事件队列。主要,这不同于osip 的事务和事件队列。 4.1.6 调用extl 指向的结构体的init 函数指针,初始化网络接口。

4.2在socket 接口上进行监听

这步通过调用eXosip_listen_addr 接口完成。 主要完成工作如下:

4.2.1 将eXosip 全局变量的eXtl 指针指向eXtl_udp 全局变量。

4.2.2 根据参数,配置extl_protocol 和exosip 上有关ip 端口地址等信息。另外,调用extl_udp的tl_open 函数指针,完成在本机指定的端口上监听连接的工作。需要注意的是,虽然是监听,但是使用的UDP 来建立连接的,所以消息的recv 和发送在同一个socket 上完成。在osip中设置的out_socket 并不会起作用。

4.2.3 调用osip_thread_create 创建exosip 后台任务,用于驱动osip 的状态机。(在osip 中, 在发送sip 消息部分,提到将9 个函数放到一个线程中执行,exosip 就是这样做的)

下面展示了初始化的示例代码: include int i;

TRACE_INITIALIZE (6, stdout); i=eXosip_init(); if (i!=0) return -1;

i = eXosip_listen_addr (IPPROTO_UDP, NULL, port, AF_INET, 0); if (i!=0) {

eXosip_quit();

fprintf (stderr, \return -1; }

... then you have to send messages and wait for eXosip events...

这样,在初始化完成后,我们基本上完成了对内存中所用数据结构的配置,同时启动了 一个后台任务负责osip 状态机的驱动。

5、数据收发整体框架

5.1 接收过程

在初始化过程中我们创建了一个后台任务,现在可以看看这个后台任务都做了哪些操作。 任务的执行函数为_eXosip_thread,在该接口中,循环不断的调用eXosip_execute。在每一次 的eXosip_execute 执行中,完成如下的工作:

a. 首先计算出底层osip 离当前时间最近的超时时间。也就是查看底层所有的超时事件,

5

找出其中的最小值,然后将其与当前时间做差,结果就是最小的超时间隔了。这步是通 过调用接口osip_timers_gettimeout 完成的。主要检查osip 全局结构体上的ict、ist、nict、 nist 以及ixt 上所有事务的事件的超时时间。如果 ict 事务队列上没有事件,则说明没 有有效的数据交互存在,返回值为默认的一年,实际上就是让后面的接收接口死等。如 果有事务队列上的事件的超时时间小于当前值,则说明已经超时了,需要马上处理,此 时将超时时间清为零,并返回。

b. 调用 eXosip_read_message 接口从底层接收消息并处理。如果返回-2,则任务退出。 c. 执行 osip 的状态机。具体为执行osip_timers_ict(ist|nict|nist)_execute 和osip_ict (ist|nict|nist)_execute 这几个函数。最后还检查释放已经终结的call、registrations 以及 publications。

d. 如果 keep_alive 设置了,则调用_eXosip_keep_alive 检查发送keep_alive 消息。 这样,当远端的终端代理发送sip 消息过来时,会被之前创建的监听端口捕获(sip 协议 默认的端口为5060)。在调用eXosip_read_message 接口时会将其接收上来。接收上来的数据存放在buffer 中交给接口_eXosip_handle_incoming_message 来处理。在其中首先调用osip_parse 进行消息的解析,这是osip 的核心功能之一。数据解析后,会生成一个osip_event 类型的事件。接着调用osip_message_fix_last_via_header 将接收到该消息的ip 地址和端口根据需要设置到数据头的via 域中。这在消息返回时有可能发挥作用。为了能够让消息正确的被处理,调用osip_find_transaction_and_add_event 接口将其添加到osip 的事务队列上。处理在这之后发生了分叉,如果osip 接纳了该事件,接口直接返回,因为这说明该事件在osip 上已经有匹配的事务了,或者说该事件是某一个事务过程的一部分。这样在后面执行状态机的接口时,该事件会被正确的处理。如果osip 没有拿走该事件,则说明针对该事件还没有事务与之对应。此时,我们首先检查其类型,如果是request,则说明很可能是一个新的事件到来( 这将触发服务端的状态机的建立), 调用eXosip_process_newrequest 接口进行处理。如果是response , 则调用接口eXosip_process_response_out_of_transaction 处理。在 eXosip_process_newrequest 接口中,如果是合法的事件,则会为其创建一个新的事务。 也就是说这是新事务的第一个事件。经过一大堆的处理后,该事件可能就被osip 消化了, 或者被exosip 消化了。如果需要上报给应用,由应用拿来对一些信息进行存储或者进行图 形显示之类,则会将该事件添加到exosip 的事件队列上。如下图所示:

6

应用程序在exosip 初始化完之后需要调用如下类似的代码,不断从事件队列上读取事件, 并进行处理。

eXosip_event_t *je; for (;;) {

je = eXosip_event_wait (0, 50); eXosip_lock();

eXosip_automatic_action (); eXosip_unlock(); if (je == NULL) break;

if (je->type == EXOSIP_CALL_NEW) { .... .... }

else if (je->type == EXOSIP_CALL_ACK) { .... .... }

else if (je->type == EXOSIP_CALL_ANSWERED) { .... .... }

else ..... .... ....

eXosip_event_free(je); }

读到事件后,判断其类型进行对应的处理。这样整个接收流程就完成了。

5.2 发送过程

要发送数据时,需要根据消息类型,调用exosip 对应模块的api 接口函数来完成。如果 要发送的sip 消息不属于当前已有的任何事务,则类似接收过程,调用osip 的相关接口创建 一个新的事务,同时根据消息生成一个事件,加到事务的事件队列上。最后,唤醒exosip 后台进程,使其驱动osip 状态机,执行刚添加的事件,从而完成数据的状态处理和发送。 当然,也有一些消息并不通过osip 状态机,而是由exosip 直接调用回调函数cb_snd_message 完成发送。

7

6、 exosip 与上层应用以及osip 之间的流程关系

exosip 是对osip 库的扩展,那么它与osip 之间是什么样的关系呢,这可参看下图:

上图为接收过程的示意图。Exosip 后台任务不断从网络另一端读取sip 消息,交给osip 的parser 模块解析,并将其转换为events,添加到事务队列上。同时,exosip 后台任务在不断的驱动osip 的状态机,这样,事务队列上的事件就会被处理。如果需要响应对端,状态机会根据回调函数的设置,直接完成数据的发送。同样,如果要将当前处理反馈给应用,则将其发送到事件队列上(这里是exosip 的事件队列),并通过e-ctl 管道通知应用进行处理。应用需要发送数据时,流程如下图所示:

此时,应用调用exosip 提供的辅助函数(上图中虚线示意此关系),构造osip 事件,将 其添加到osip 的事务队列上。同时,应用通过s-ctl 管道通知exosip 后台任务执行状态机。 在exosip 执行状态机的过程中,sip 消息会被发送到网络另一端的终端。

8

exosip2协议栈原理分析以及总结 - 图文.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c3sox9347z02b61z989j4_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top