resiprocate协议栈分析内容摘要:
TransactionTerminated*, TimerMessage*, SipMessage* or derived ApplicationMessage* */ Message* receiveAny()。 /** Return true if the stack has new messages for the TU. Since the addition of TransactionUsers, this method is deprecated. This only looks into the old TuFifo that is not associated with any TransactionUser. @deprecated */ bool hasMessage() const。 五、几个成员变量的说明 /// if this object exists, it manages advanced security featues Security* mSecurity。 这是 如果需要安全处理而用到的类。 DnsStub* mDnsStub。 这是如果自己定义 DNS处理的话所需要的 DNS处理的存根和截取器。 /// if this object exists, it get39。 s notified when ApplicationMessage39。 s get posted AsyncProcessHandler* mAsyncProcessHandler。 异步处理的基类指针对象,可以自定义异步处理的方式。 /** fifo used to municate between the TU (Transaction User) and stack Note: since the introduction of multiple TU39。 s this Fifo should no longer be used by most applications each TU now owns it39。 s own Fifo. */ TimeLimitFifoMessage mTUFifo。 这个就不用说啦,看注释吧。 /// Protection for AppTimerQueue mutable Mutex mAppTimerMutex。 整个协议栈的同步都是集中利用了源码中实现的同步对象,非常不错,实现同步类的理论基础应该是基于大师 BS的理论“资源开 始即初始化”。 /// All aspects of the Transaction State Machine / DNS resolver TransactionController mTransactionController。 /** store all domains that this stack is responsible for. Controlled by addAlias and addTransport interfaces and checks can be made with isMyDomain() */ std::setData mDomains。 /// Responsible for routing messages to the correct TU based on installed rules TuSelector mTuSelector。 TransactionController 模块 在 SipStack中看到这样的描述: /// All aspects of the Transaction State Machine / DNS resolver TransactionController mTransactionController。 注意 all aspects在我的理解中这又是一个界面类, SipStack是 Sip Core整个庭院的外围的门面的话这又是进入庭院后第二道城墙;就如庭院高深的故宫和亭廊回环的苏州园林它们的实现中更有层次的递张以及庭院间的交互回环。 BS教导我们不要写“臃肿的界面”, SipStack这个大界面里面又套这个实现层次的界面是不是一种 好的实践呢。 我的理解是,应该是这样的。 ―――努力达到界面和实现分离。 现在就看看这个 Transaction State Machine / DNS resolver界面类吧,在我的实现中,其实把 DNS Resolver部分清理掉啦,导致只是个 Transaction State Machine 的界面类吧。 如果仔细看看 TransactionControl 的函数也就是它的接口函数的话和 SipStack就差不离,翻版而也,就是一道门进去还是一道门,就连造型都差不多,外面是拱洞型的里面还是;故宫和苏州园林的设计 把古建筑的设计模式推向了极致。 还是列一下吧: void process(FdSetamp。 fdset)。 unsigned int getTimeTillNextProcessMS()。 void buildFdSet(FdSetamp。 fdset)。 // graceful shutdown (eventually) void shutdown()。 TransportSelectoramp。 transportSelector() { return mTransportSelector。 } const TransportSelectoramp。 transportSelector() const { return mTransportSelector。 } bool isTUOverloaded() const。 void send(SipMessage* msg)。 再看一下几个重要的成员变量: // fifo used to municate to the transaction state machine within the // stack. Not for external use by the application. May contain, sip // messages (requests and responses), timers (used by state machines), // asynchronous dns responses, transport errors from the underlying // transports, etc. FifoTransactionMessage mStateMacFifo。 // from the sipstack (for convenience) TuSelectoramp。 mTuSelector。 // Used to decide which transport to send a sip message on. TransportSelector mTransportSelector。 // stores all of the transactions that are currently active in this stack TransactionMap mClientTransactionMap。 TransactionMap mServerTransactionMap。 重点和关键成员变量: FifoTransactionMessage mStateMacFifo。 看看这个成员变量的价值: void TransactionController::send(SipMessage* msg) { (msg)。 } 消息的流动不可能到此为止,它要上传下递,如何实现的呢。 看看构造函数吧: TransactionController::TransactionController(SipStackamp。 stack) : mStack(stack), mRegisteredForTransactionTermination(false), mDiscardStrayResponses(true), mStateMacFifo(), mTuSelector(), mTransportSelector(mStateMacFifo, (), ()), mTimers(mStateMacFifo), mShuttingDown(false), mStatsManager() { } 既然都点出来了,就继续往下看看,看看流向 TransportSelector会怎样呢 : TransportSelector::TransportSelector(FifoTransactionMessageamp。 fifo, Security* security, DnsStubamp。 dnsStub) : mDns(dnsStub), mStateMacFifo(fifo), mSecurity(security), mSocket( INVALID_SOCKET ), mSocket6( INVALID_SOCKET ) { memset(amp。 , 0, sizeof(sockaddr_in))。 = AF_UNSPEC。 } 再让我们看另外一支,只是一直在 Process中处理的: void TransactionController::process(FdSetamp。 fdset) { if (mShuttingDown amp。 amp。 !() amp。 amp。 !() amp。 amp。 ()) {。 } else {。 while (()) { TransactionState::process(*this)。 } } } TransactionState 的这个静态函数 Process 的参数居然是 *this,也就是是说 TransactionState 能从TransactionControler 得到它所要的内容,因此先让我们过去浏览一下先: 想了一下这儿放下暂且不表,我们到 TransactionState 部分再详细到来,但是我们知道下一步的流向将是哪儿。 再粗粗的看了一下 TransactionControler 我们发现内容并不多, Control 者只是一个控制调节的角色,它是一个 contact window。 向外是联系的窗口,向内负责安排和 分派其他包容的角色去实现。 在 TransactionControler 中有两个比较重要的成员变量: // from the sipstack (for convenience) TuSelectoramp。 mTuSelector。 // Used to decide which transport to send a sip message on. TransportSelector mTransportSelector。 // stores all of the transactions that are currently active in this stack TransactionMap mClientTransactionMap。 TransactionMap mServerTransactionMap。 可以看出它包含和管理的分别是三个层次的对象: Transaction User、 Transport、 TransactionState 它对这几个对象的互动和控制基本就在 Process里面完成。 并且为了以示关联,我们先 看看 mClientTransactionMap 是在哪儿体现它的价值的: void TransactionState::add(const Dataamp。 tid) { if (mMachine == ClientNonInvite || mMachine == ClientInvite || mMachine == ClientStale || mMachine == Stateless )。resiprocate协议栈分析
相关推荐
ctiveSync ●将“ Microsoft ActiveSync 桌面计算机软件”光盘放入您的光驱。 Microsoft ActiveSync 安装向导将自动运行。 如果该向导没有运行,可到光驱所在盘符根目录下找到 后双击它运行。 ●单击 下一步 安 装 Microsoft ActiveSync。 连接 手簿 与 PC 安装了 Microsoft ActiveSync后,请重新启动您的计算机
,字号根据字数多少确定。 竣工图的编制应符合下列要求: 1 在施工中发生过设计变更的,应由设计单位按最终修改状况绘制最终版施工图,加盖终版图章后发施工承包单位,由施工承包单位核对确认后加盖竣工图章; 3 设计单位的最终版施工图应在工程中间交工后一个月凡新建工程涉 及原有工程 引进工程竣工图应在国外承包商提供的最终版施工图上按上述原则编制。 施工承包单位按照工程承包合同规定的 5
6下列专用于盛装乙炔是: C A、压缩气体气瓶 B、液化气体气瓶 C、溶解气体气瓶 D、高压气体气瓶 6永久气体气瓶属于:( 高压 )气瓶 6 按照产生的原因和性质,爆炸可分为( C ) 、化学爆炸、炸药爆炸 、化学爆炸、锅炉爆炸 、化学爆炸、核爆炸 、核爆炸、分解爆炸 6 承压后受力最均匀的形状是( A ) A球形 三、多选题 化学危险物质的主要特性有( ABCD) A 易燃易爆性 B 扩散性
检查制度 ............................................................................................. 229 专项检查制度 .........................................................................................
慨相助,你将从内心感叹社会的温暖,人间的美好;目睹落后和假恶丑,你会是非分明,态度坚决,倾吐出追求进步,呼唤真善美 的心声„„请以 “说句心里话 ”为题,写一篇 600字左右的文章。 二、 作文指导: 题解 : 这个作文题从语法角度看,是一个动宾短语。 动词 “说 ”,即诉说、倾吐的意思;重心在宾语部分的 “心里话 ”。 “心里话 ”就是发自内心的话。 作文时,要有 “心里话 ”可说,怎样说出
小象的故事:马戏团的一头小象很淘气,总想到处跑。 工作人员在他腿上拴上一条细铁链,另一头系在铁杆上。 小象对这根铁链很不习惯,它用力去挣,挣不脱,无奈的他只好在铁链范围内活动。 过了几天,小象有使这项挣脱铁链,可是还没成功,他只好闷闷不乐的老实下来。 一次又一次,小巷总也挣不脱这根铁链。 慢慢的。 他不再去试了,他习惯铁链了。 在看看父母也是一样吗,好象本来就应该是这个样子。 小象一天天火葬打了