Q/CT XXXX.1-2008
eXosip_read_messageosip_timers_ict_executeosip_timers_nict_executeosip_timers_ist_executeosip_timers_nist_executeosip_nist_executeosip_nict_executeosip_ist_executeosip_ict_executeeXosip_release_terminated_callseXosip_release_terminated_registrationseXosip_release_terminated_publications_eXosip_keep_alive
在每次执行eXosip_execute时,先会去读取message,所以运行线程一直在监听是否有消息发送到本客户端,对于要发送的message,都是管理程序主动调用接口进行发送的。在处理接收到的message时可能会创建新的call、新的transaction,生成新的transaction的event,还有exosip的event。其中exosip的event是上报给管理程序的,在管理程序中根据具体的实际情况进行处理。其能够参数的各种event的定义在文件exosip.h的枚举typedef enum eXosip_event_type中。
在读取完一个message并做了预处理之后(也可能没有新的message需要处理),
exosip_execute开始处理osip中4条transaction链表中的定时器,如果定时器超时,则产生新的定时器事件并放入transaction的事件队列中,然后开始执行4条transaction链表中的每个transaction的事件,其中包括对message部分的后半部处理。这两部分的代码分析在osip lib包分析部分已经有分析。
在处理完上面部分后,开始释放已经结束的call、registration和publication。其中在registration和publication的释放的时候,只是将其中的transation从registration和publication的结构中删除,然后放在exosip全局变量的j_transaction链表中。该链表中的transaction最终会在eXosip_release_terminated_calls中释放。
同时,如果传输层使用的是UDP协议,则需要调用_eXosip_keep_alive为registration发送报文保存UDP的通信,防止UDP超时该端口被系统关闭。
中国IMS网络SIP协议规范总体技术要求 - 25 -
Q/CT XXXX.1-2008
4.2.2.1 Exosip_read_message的处理
Exosip_read_message根据使用的传输层协议,调用传输层的tl_read_message函数从TCP/IP协议栈底层读取message。如果从传输层读取message成功,则交给
_eXosip_handle_incoming_message进行处理。在_eXosip_handle_incoming_message中,首先解析该message,如果解析成功,在解析完之后,检查message中的必要字段call_id number。如果管理程序在exosip中注册了message的消息处理函数,则回调注册该函数。然后根据message的类型,检查合法性并确定该message的产生的transaction的event的类型,因为是接收到message,所以类型全部为RCV_XXX类型,在发送message时,产生SND_XXX的event。因为是新接收到的message,有三种可能,一是能匹配已经存在的transaction,即是某个请求的应答或ACK;如果不能匹配,根据message中的状态码,如果是0,说明是一个请求,而且这个请