/* *********************************************************************/
SipMsgQueue *msgQ = 0;
Sptr sipPtr = msgPtr->msg.in;
if(msgPtr->msg.in->getType() == SIP_STATUS)
//这两个是处理返回消息队列的函数 , 下面将重点介绍
msgQ = sentRequestDB.processRecv(msgPtr);
else
msgQ = sentResponseDB.processRecv(msgPtr);
//更新SNMP命令队列 , 并向SNMP网管中心发送接收的消息队列;
if(msgQ)
{
msgQPtr = msgQ;
//need to have snmpDetails for this.
if (sipAgent != 0)
{
updateSnmpData(sipPtr, INS);
}
}
else if(msgPtr->msg.in != 0)
{
send(msgPtr);
}
else if(msgPtr->msg.out.length())
{
send(msgPtr);
}
else
… …
}
}
b.描述接收/发送SIP消息队列的主要类:
SipSentRequestDB:: processRecv和SipSentRequestDB::processSend是一对相互的方法 ,
另外还有SipSentResponseDB:: processRecv和SipSentResponseDB::processSend是用来记忆状态/消息的发送和接受的 , 在这里和Request的结构基本相同 , 就不做累述了;前者处理发送的SIP消息队列 , 后者处理接收的SIP消息队列 , 为了实现高效率的处理SIP的队列 , 在程序中大量采用了HASH表的方法 , 由于这个部分的程序非常的多 , 我不想一一把他们罗列出来 , 在这里就做一下简单的一个浏览:
HASH队列的抽象:在这里有三个用于表示HASH表的类:
SipTransLevel1Node , SipTransLevel2Node , SipTransLevel3Node;
第一个是表的入口 , 它的组成由:目的地址 NameAddress源地址 From以及CallID三个部分叠加而成;
第二个是表的索引 , 包括CSeq和Via 路由表
第三个就是具体的消息对了 , 也就是一个呼叫命令组的列表;详见下图:
我们下面一一个简单的例子来描述一下一个INVITE消息的处理过程:
A. 接收到一个Invite Message/发送一个180状态的情况的情况:
1. 在UDP通道收到一个INVITE消息
2. 创建了一个InvMsg,同时发送到SipSentResponseDB中做备份 , 我们要检查在这里有没有重复的副本;
3.假如没有重复 , 那么InvMsg就放入RecvFifo中 , 预备让应用层进行处理;
4.应用层通过SipTransciever接收到了InvMsg并且做出相应的处理;
5.应用层产生了180回应到SipSentResponseDB中备份 ,
6.180在SndFifo中排队 , 并且调用SipTransceiver中的SendReply方法回送消息
B.从对方接收到一个100(Trying)状态的作为向对方发送Invite消息回应的情况:
1. 在UDP通道收到一个INVITE的状态;
2. 创建了一个StatusMsg,同时发送到SipSentResquestDB中做备份 , 我们要检查在这里有没有重复的副本;
3.假如没有重复 , 那么StatusMsg就放入RecvFifo中 , 预备让应用层进行处理;
4.应用层通过SipTransciever接收到了StatusMsg并且做出相应的处理;
5.应用层产生了ACK回应到SipSentResquestDB中备份 ,
6.180在SndFifo中排队 , 并且调用SipTransceiver中的SendAsync方法回送ACK消息,
c.在存在一个呼叫重新定向的情况:
*我们下面来看一个更加复杂一点的情况:
1>SipSendtRequestDB::processSend方法:
我们可以做一个很简单的举例 , 大家就对这两个方法有比较深入的了解了 , 可以以上面的Diagram1来做一个很好的例子比如 , Marshal Server开始发送一个Invite的消息 , 由SipSendtRequestDB::processSend来进行处理 , 同时并且把这个消息装入SipMsgContainer中 , 然后消息被插入到SipTransactionList队列中:
topNode->findOrInsert(id)->val->findOrInsert(id)
最后放在SipTransLevel1Node,SipTransLevel2Node,SipTransLevel3Node形成一个新的节点 。
推荐阅读
- br软件是干嘛的
- 小孩叛逆期一般在什么年龄段
- 逆向工程技术的发展趋势
- 档案室用什么类型的灭火器
- adobe reader xi如何使用签名文档?
- 湖藕与莲藕的区别 湖藕与莲藕的区别在哪
- 现存老虎的种类有多少种小说中武松在景阳冈上打死的老虎是什么品种的有何依据
- 长虹 M618购机几天来的一些心得
- word中打出下划线具体操作方法
- 蛤蜊油是什么做的,蛤蜊油是什么 蛤蜊油成分 蛤蜊油作用