Resiprocate介绍 下载本文

内容发布更新时间 : 2024/5/20 19:35:52星期一 下面是文章的全部内容请认真阅读。

DialogUsageManager:: makeInviteSession - ? DialogUsageManager::send ? DialogUsageManager::sendUsingOutboundIfAppropriate ? SipStack::sendTo -? TransactionController::send( 在此处被添加进了FiFo -- mStateMacFifo.add ) 这之后就是等待被处理( TransactionController::process )

// new sip msg from the TU

////注解一下两个函数名sendToWire 这是往外发送,发到线上去就是往网线上朝外发//啦,sendToTU就是往TransactionUser送往事务层发啦一般是接收到的SipMessgae //从Transport往上递交。

以发起一新的INVITE所进行的后台Process流程为例: void

TransactionState::process( TransactionController& controller ) ? void TransactionState::processClientInvite( TransactionMessage* msg ) ? void TransactionState::sendToWire(TransactionMessage* msg, bool resend ) ?

下面摘录一下TransactionState::sendToWire(TransactionMessage* msg, bool resend)中的部分 源码注释一下:

mDnsResult = mController.mTransportSelector.dnsResolve(sip, this); //这一部//分就是整个源码中Ares上场表演的时候了,这部分是DNS处理的实现,在我的移植//中我把这部分简单改写成了调用windows的dns函数如gethostbyname/gethostname //系列。

handle(mDnsResult);

void TransportSelector::transmit(SipMessage* msg, Tuple& target) ?

再给段transmit中源码:

Data& encoded = msg->getEncoded(); encoded.clear();

21

DataStream encodeStream(encoded); msg->encode(encodeStream); encodeStream.flush();

target.transport->send(target, encoded, msg->getTransactionId());

void

Transport::send( const Tuple& dest, const Data& d, const Data& tid)

void

InternalTransport::transmit(const Tuple& dest, const Data& pdata, const Data& tid) {

SendData* data = new SendData(dest, pdata, tid); mTxFifo.add(data); }

最后到这儿就出去了(以UdpTransport为例): void

UdpTransport::process(FdSet& fdset) {

////只列举关键代码

if (mTxFifo.messageAvailable() && fdset.readyToWrite(mFd)) {

std::auto_ptr sendData = std::auto_ptr(mTxFifo.getNext());

const sockaddr& addr = sendData->destination.getSockaddr(); 0, &addr, sendData->destination.length()); }

int count = sendto(mFd, sendData->data.data(), sendData->data.size(),

22

流程图:

23

Incoming messages 的源码流动就简单一些,收的处理是被动的,因此是在Process中后台接收然后上传:

看看UdpTransport::process最后把接收到的Buffer组织成SipMessage后放到了哪里: stampReceived(message); mStateMachineFifo.add(message);

还是放到了Fifo& mStateMachineFifo; // passed in 这个先进先出队列中。

我们看看接下来的几个函数就可以看到各个类里面的先进先出对列是如何关联起来的,也能明白上面的接收队列后来会在哪些地方会被处理到:

TransactionController::TransactionController(SipStack& stack, bool stateless) : mStack(stack), mStateless(stateless),

mRegisteredForTransactionTermination(false), mDiscardStrayResponses(true),

24