Resiprocate介绍 下载本文

mStateMacFifo(), //这个地方 mTuSelector(stack.mTuSelector),

mTransportSelector(mStateMacFifo),//TransportSelector中的mStateMacFifo这//样就和TransactionController中的mStateMacFifo代表了同一个对象 mStatelessHandler(*this), StatelessIdCounter(1), mShuttingDown(false) { }

再看看这儿(此处代码只是节选没有完全列出): void

SipStack::addTransport( TransportType protocol, int port, IpVersion version, const Data& ipInterface, const Data& sipDomainname, const Data& privateKeyPassPhrase, TransportProcessApproach threadApproach) {

InternalTransport* transport=0;

Fifo& stateMacFifo =

mTransactionController.transportSelector().stateMacFifo(); //看看,都是引用//类型,导致它们都指向了同一个先进先出的队列。 try {

switch (protocol) {

case UDP:

transport = new UdpTransport(stateMacFifo, port, version, ipInterface);//注意传引用的stateMacFifo,导致TransactionController:: //stateMacFifo其实和UdpTransport:: stateMacFifo指向同一处。 break; case TCP:

transport = new TcpTransport(stateMacFifo, port, version, ipInterface);

25

break; default: assert(0); break; } } }

上面所列举的源码是为了引出下面这一段,这儿是接收和发送SIP Message的后台处理的一一个Process;搜搜整个源码有好几个Process,正是这一串Process让各种SIP Message在各层和各种类型实例间流动了起来: void

TransactionController::process(FdSet& fdset) {

mTransportSelector.process(fdset);

while (mStateMacFifo.messageAvailable()) //从这儿就能看到收发SipMessage//统一会在这儿处理。 {

if (mStateless) {

mStatelessHandler.process(); } else {

//Uagent一般就在这儿处理啦 TransactionState::process(*this); } } } void

TransactionState::process(TransactionController& controller) {

TransactionMessage* message = controller.mStateMacFifo.getNext(); }

26

以上种种TransactionController是个事务控制类,它在SipMessage的流动中起到了一个中间桥梁的作用。

接下来再看看接收到的SipMessage如何一步步上传到事务层/用户层。 void

TransactionState::process(TransactionController& controller) ? void TransactionState::sendToTU(TransactionUser* tu, TransactionController& controller, TransactionMessage* msg)

这段代码比较少,放上来: void

TransactionState::sendToTU(TransactionUser* tu, TransactionController& controller, TransactionMessage* msg) {

msg->setTransactionUser(tu);

controller.mTuSelector.add(msg, TimeLimitFifo::InternalElement); }

接下来的处理: void

TuSelector::add(Message* msg, TimeLimitFifo::DepthUsage usage) {

//省去旁支末节代码后

msg->getTransactionUser()->postToTransactionUser(msg, usage); }

void

TransactionUser::postToTransactionUser(Message* msg, TimeLimitFifo::DepthUsage usage) {

mFifo.add(msg, usage); }

27

这下接收到的SipMessage就到了TransactionUser其实就是交到了

DialogUsageManager手中,接下来就是由DialogUsageManager来根据状态来决定如何根据接收到的SipMessage来处理(如最终触发各种事件)。

最后再来贴贴这幅图回顾一下,加深理解:

28