ResipRocate协议栈(looking)
- 格式:doc
- 大小:941.50 KB
- 文档页数:54
基于SIP的B2BUA服务器设计作者:庄伟胤唐余亮来源:《中国新通信》2014年第07期【摘要】 Session Initiation Protocol(SIP)是下一代网络的核心控制协议,用于在IP数据网络上建立、改变和结束多媒体会话。
SIP服务器作为下一代网络的核心设备,它的实现就显得尤为重要。
一种方法是代理服务器Proxy,它只在SIP交互时保存状态,而不是在整个呼叫中维护状态,这限制了代理服务器更大范围的应用。
另一种方法是背对背的用户代理(B2BUA,Back-to-Back User Agent)服务器,它在整个呼叫过程中都维护状态。
文章从SIP 协议的基本原理出发,利用reSIProcate协议栈实现SIP B2BUA服务器并对其做了压力测试。
【关键词】 RFC 3261 SIP B2BUA一、SIP协议SIP是2001年推出的IETF标准(RFC 3261),用于在IP数据网络上建立、改变和结束多媒体会话。
SIP系统采用C/S模型,定义了服务器和用户代理。
SIP系统的端系统称为用户代理(User Agent,UA),包含用户代理客户端(User Agent Client,UAC)和用户代理服务器(User Agent Server,UAS)。
UAC负责呼叫的发出,而UAS负责呼叫的接收。
典型的基于Proxy的呼叫过程为:主叫方向被叫方发出INVITE请求消息,开始建立会话。
Proxy接收到这条消息时会回复一条100 Trying告诉主叫方消息正在处理,然后INVITE 消息经过Proxy路由转发到被叫方,被叫方回复100 Trying 和180 Ringing响铃,被叫方接听回复200 OK,主叫方回复ACK,会话建立。
要结束会话时,其中一方发送BYE消息,另外一方回复200 OK。
二、B2BUA服务器介绍按照RFC 3261中的定义,B2BUA是一个逻辑实体,它就像UAS一样接收和处理请求。
resiprocate编译
【原创实用版】
目录
1.介绍 Resiprocate 编译器
2.Resiprocate 编译器的特点
3.Resiprocate 编译器的应用领域
4.Resiprocate 编译器的未来发展
正文
Resiprocate 编译器是一款新兴的编程语言编译器,它以其高效性和灵活性而备受关注。
Resiprocate 编译器可以将源代码编译成机器语言,从而实现程序的运行。
与其他编译器相比,Resiprocate 编译器具有以下特点。
首先,Resiprocate 编译器具有高效的编译速度。
它采用了先进的编译技术,可以快速地将源代码转换为机器语言,从而提高了程序的运行速度。
其次,Resiprocate 编译器具有灵活的语法。
它支持多种编程语言,包括 C、C++和 Java 等,可以满足不同领域程序员的需求。
此外,Resiprocate 编译器还广泛应用于各种领域,如计算机视觉、人工智能和机器学习等。
在这些领域中,Resiprocate 编译器可以帮助程序员快速地开发和优化程序,从而提高程序的性能和效率。
对于未来,Resiprocate 编译器将继续发展,以满足不断变化的市场需求。
它将引入更多的编程语言支持,提高编译速度和性能,并提供更多的开发工具和资源,以帮助程序员更好地利用 Resiprocate 编译器。
总之,Resiprocate 编译器是一款高效、灵活的编程语言编译器,它具有广泛的应用领域和良好的未来发展前景。
视频通话分析1:IP网络通讯协议在传统电话系统中,一次通话从建立系统连接到拆除连接都需要一定的信令来配合完成。
同样,在IP电话中,如何寻找被叫方、如何建立应答、如何按照彼此的数据处理能力发送数据,也需要相应的信令系统,一般称为协议。
目前在国际上,比较有影响的IP电话方面的协议包括ITU-T提出的H.323协议和IETF提出的SIP协议。
而MGCP主要应用于运营商市场,在行业市场鲜有应用。
1.1:协议概要分析1.1.1:H323协议H.323是ITU-T第16工作组的建议,由一组协议构成,其中有负责音频与视频信号的编码、解码和包装,有负责呼叫信令收发和控制的信令,还有负责能力交换的信令。
H.323的第4版本具备做电信级大网的特征,以它为标准构建的IP电话网能很容易地与传统PSTN(公共交换电话网络)电话网兼容,从这点上看,H.323更适合于构建电话到电话的电信级大网。
H.323协议族规定了在主要包括IP网络在内的基于分组交换的网络上提供多媒体通信的部件、协议和规程。
H.323一共定义了四种部件:终端,网关,网守和多点控制单元。
利用它们,H.323可以支持音频、视频和数据的点到点或点到多点的通信。
H.323协议族包括用于建立呼叫的H.225.0、用于控制的H.245、用于大型会议的H.332 以及用于补充业务的H.450.X等。
H.323 协议中包含3条信令控制信道:RAS (R=注册:Registration、A=许可:Admission 和S=状态:Status)信令信道、呼叫信令信道和H.245 控制信道。
3 条信道的协调工作使得H.323的呼叫得以进行。
H.323建议是一个较为完备的建议书,它提供了一种集中处理和管理的工作模式,这种工作模式与电信网的管理方式是匹配的,这就是为什么电信网中使用的IP电话几乎无例外地都采用了基于H.323的IP电话工作模式。1.1.2:SIP协议SIP协议,即Session Initiation Protocol,是另一套IP电话的体系结构,是一个与H.323并列的协议。
Resiprocate简介1、背景介绍随着VoIP和NGN技术的发展,H.323时代即将过渡到SIP时代,在H.323的开源协议栈中,Openh323占统治地位,它把一个复杂而又先进的H.323协议栈展现在普通程序员的眼前,为H.323普及立下了汗马功劳。
而然当在SIP时代,则出现了群雄割据的状况,SIP 相对于H.323简单,灵活,于是各种协议栈层出不穷,一下主要介绍对ReSIProcate协议栈的理解。
ReSIProcate是由SIPFoundry开发,ReSIProcate最开始起源于Vocal,由于Vocal开始只支持rfc3254,为了支持最新的rfc3261,ReSIProcate诞生了,但现在,ReSIProcate 已经成为一个独立SIP协议栈了,它十分稳定,并且很多商业程序都在使用。
具体参数:Language : C++VxWorks port : NoWin32 port : YesLinux port : YesSupports RFC 3261 : YesSupports RFC 2327 : YesSupports RFC 3264 : YesSupports RFC 3263 : PartialSupports RFC 3515 : YesSupports RFC 3262 : NoSupports RFC 3311 : NoTCP : YesUDP : YesSIZE : < 2.5 MbLicense : VovidaDocument : FewSamples : None2、SIP基本呼叫下面是一个SIP协议的基本呼叫流程图以及对该流程的简单讲解。
SIP Base Call Flow上图描述的是一个SIP基本呼叫的流程图,主被叫SIP UA分别注册在不同的Server 上,以下对上述流程做一简单说明。
流程说明:2.1、首先主叫SIP UA摘机拨叫被叫号码,SIP UA向注册的server上发送invite消息,携带主被叫的URL和主叫SDP(也可以不带);2.2、SIP Proxy1收到invite后对URL进行解析,找到被叫SIP UA的注册Server并路由;2.3、SIP Proxy收到invite后解析URL,找到被叫SIP UA,发送invite;2.4、被叫SIP UA收到后,分析该消息处理时间可能超长,向主叫发送100Trying,通知主叫被叫正在处理主叫请求;2.5、然后被叫SIP UA指示放回铃音,并发送Alertting(可能会带SDP)消息给主叫,通知主叫被叫正在放回铃音;2.6、之后被叫摘机应答,向主叫发送200OK携带被叫的SDP(如果Alertting已经携带了SDP,则200OK不带SDP),主叫收到后向被叫回ACK消息确认。
蓝牙协议栈详解蓝牙协议栈是指蓝牙通信中的软件协议,它定义了蓝牙设备之间的通信规则和数据传输方式。
蓝牙协议栈由多个层次组成,每个层次负责不同的功能和任务。
本文将对蓝牙协议栈的各个层次进行详细解析,以便读者更好地理解蓝牙通信原理。
1. 物理层(Physical Layer)物理层是蓝牙协议栈中最底层的层次,它定义了蓝牙设备的无线通信方式和频率。
蓝牙使用2.4GHz的ISM频段进行通信,采用频率跳变技术来避免干扰。
物理层还定义了蓝牙设备的功率等级和传输速率,以及通信距离的限制。
2. 链路层(Link Layer)链路层是蓝牙协议栈中的第二层,它负责建立和管理蓝牙设备之间的连接。
链路层主要包括两个子层:广告子层和连接子层。
广告子层负责设备的广告和发现,用于建立连接;连接子层负责连接的建立、维护和关闭。
链路层还定义了蓝牙设备之间的数据传输方式,如数据包的格式、错误检测和纠错等。
3. 主机控制器接口(Host Controller Interface,HCI)主机控制器接口是蓝牙协议栈中的第三层,它定义了主机和主机控制器之间的通信方式。
主机控制器接口可以通过串口、USB等方式与主机连接,主要负责传输命令和数据,以及处理主机和主机控制器之间的事件和状态。
4. L2CAP层(Logical Link Control and Adaptation Protocol)L2CAP层是蓝牙协议栈中的第四层,它提供了面向连接和面向无连接的数据传输服务。
L2CAP层可以将较大的数据包分割成多个小的数据包进行传输,并提供可靠的数据传输机制。
L2CAP层还支持多个逻辑信道的复用和分离,以满足不同应用的需求。
5. RFCOMM层(Radio Frequency Communication)RFCOMM层是蓝牙协议栈中的第五层,它通过虚拟串口的方式提供串行数据传输服务。
RFCOMM层允许应用程序通过串口接口与蓝牙设备进行通信,实现数据的传输和控制。
lwip协议栈详解
lwIP(lightweight IP)是一个轻量级的开源TCP/IP协议栈,它专为嵌入式系统
设计,占用资源少,运行效率高。
本文将对lwIP协议栈进行详细解析,包括其特点、结构、功能和应用场景等方面的内容。
lwIP协议栈具有以下几个显著特点,首先,它是一个轻量级的协议栈,占用资
源少,适合于嵌入式系统;其次,lwIP采用事件驱动的设计,能够有效地利用系
统资源,提高系统的响应速度;最后,lwIP支持多种网络接口和协议,包括TCP、UDP、IP、ICMP等,可以灵活地应用于各种网络环境中。
lwIP协议栈的结构主要包括核心协议层、网络接口层和应用层三个部分。
核心
协议层包括IP层、TCP层和UDP层,负责处理网络数据包的传输和路由;网络接
口层负责与硬件设备进行交互,包括以太网驱动、Wi-Fi驱动等;应用层则提供了
常用的网络应用接口,如HTTP、FTP等。
在实际应用中,lwIP协议栈可以广泛应用于各种嵌入式系统中,如工业控制系统、智能家居设备、物联网设备等。
它可以帮助开发人员快速搭建起一个稳定、高效的网络通信环境,实现设备之间的数据交换和远程控制。
总的来说,lwIP协议栈是一款功能强大、灵活性高的轻量级TCP/IP协议栈,
适用于各种嵌入式系统。
它的设计精巧,性能优越,可以帮助开发人员快速搭建起一个稳定、高效的网络通信环境。
希望本文对lwIP协议栈有所帮助,谢谢阅读!。
Resiprocate介绍1.前言本文主要内容来自互联网,特此感谢Steven的辛苦撰写和resiprocate开源组织的无私奉献以及sip协议的创造者Schulzrinne教授和Rosenberg大师的辛勤工作。
2.从SIP谈起说明:不期待一次就把RFC3261或者其他的协议文档内容及其细节全部记住或者完全理解;把原理性的东西及其脉络厘清也许更重要;在调试程序和看协议栈源码的过程中我的做法是一直把RFC3261(经常的是那份中文文档☺的文档打开;遇到忘记或者不是太明白的概念和内容就在文档中再搜索相关主题及内容来看看;经常会碰到这样的问题,我发个内容给SIPProPP或者SIPServer,可是并没得到我希望的回复或者与期待的回复内容有出入,这时,我的经常做法是再去研读协议的相关定义,看看是不是我哪个细节并没理解深入或者引起注意,导致我发出去的内容与协议标准有出入或者我的流程与协议定义不吻合。
接下来的内容是前人的文档整理,只是个大概,如果没兴趣,完全可以跳过不看;协议栈部分基本上是分成DUM与Stack两部份可以先后看,也可以先看Stack部分。
补充说明:文档中的大部分图片都来自网上公开的资料,只有少数几幅是自绘,因此出现内容不清和误导,概不负责☺特此感谢借鉴资料和图片的原创者们,虽然他们并不知道又误导了一个菜鸟。
2.1SIP(SessionInitiationProtocol)简介最先由美国哥伦比亚大学的HenningSchulzrinne教授在1998年初开始发起,1999年3月由IETF的MMUSIC(MultipartMultimediaSessionControl)工作小组制定正式标准成为RFC2543,1999年9月IETF成立新的工作小组,负责SIP新版本2.0的制定,并于20PP年7月释出初版RFC2543bis,于20PP年发布了RFC3261。
RFC3261的发布,标示着SIP的基础已经确立,随后又发布了几个RFC增定版本,充实了安全性及身份认证等几个领域的内容,例如RFC3262对临时响应做了可靠性的规范。
tcpip协议栈TCP/IP协议栈。
TCP/IP协议栈是互联网的基础协议,它是一组用于互联网的通信协议。
TCP/IP 协议栈由四层构成,分别是网络接口层、网络层、传输层和应用层。
每一层都有其特定的功能和作用,下面将对TCP/IP协议栈的每一层进行详细介绍。
首先是网络接口层,它负责将数据包从一个主机传输到另一个主机。
在这一层,数据包被封装成帧,并通过物理介质进行传输。
网络接口层的协议有以太网、无线局域网等,它们定义了数据在物理介质上传输的格式和规则。
接下来是网络层,网络层主要负责数据包的路由和转发。
在网络层,数据包被封装成数据报,并通过IP地址进行传输。
网络层的主要协议是IP协议,它定义了数据包的格式和路由规则,确保数据包能够在网络中正确地传输到目的地。
然后是传输层,传输层主要负责端到端的通信。
在传输层,数据被封装成报文,并通过端口号进行传输。
传输层的主要协议有TCP和UDP,它们定义了数据的传输方式和可靠性,确保数据能够在源主机和目的主机之间可靠地传输。
最后是应用层,应用层是用户直接使用的层。
在应用层,数据被封装成消息,并通过应用层协议进行传输。
应用层的协议有HTTP、FTP、SMTP等,它们定义了不同应用程序之间的通信规则,确保不同应用程序之间能够正确地交换数据。
总的来说,TCP/IP协议栈是互联网的基础协议,它定义了数据在网络中的传输方式和规则,确保数据能够在不同主机和不同应用程序之间正确地传输和交换。
通过网络接口层、网络层、传输层和应用层的协同工作,TCP/IP协议栈实现了互联网的可靠和高效通信。
除了以上介绍的四层,TCP/IP协议栈还包括了一些辅助协议,如ARP、ICMP、DHCP等,它们在协议栈中起着重要的作用,保证了网络的正常运行和通信的顺利进行。
总的来说,TCP/IP协议栈是互联网的基础,它定义了数据在网络中的传输方式和规则,保证了网络的正常运行和通信的顺利进行。
了解TCP/IP协议栈的结构和功能对于理解互联网的工作原理和网络通信的过程具有重要意义。
SIP协议栈SIP(Session Initiation Protocol)是一种用于建立、修改和终止多媒体会话的通信协议。
它使用文本格式进行通信,并在互联网上运行。
SIP协议栈是指用于实现SIP协议的软件组件的集合,下面将介绍SIP协议栈的组成和工作原理。
SIP协议栈由多个层次组成,包括传输层、协议层和应用层。
传输层负责将SIP消息从一个节点传输到另一个节点。
常用的传输层协议包括UDP(User Datagram Protocol)和TCP (Transmission Control Protocol)。
协议层负责解析和处理SIP消息,例如建立会话、修改会话参数等。
应用层负责与用户交互,并根据需要生成SIP消息。
SIP协议栈的工作原理如下:当一个节点想要建立会话时,它将发送一个INVITE消息到目标节点。
目标节点收到INVITE消息后,将返回一个100 Trying消息表示正在处理请求。
然后,如果目标节点可以接受会话,它将返回一个180 Ringing消息表示正在响铃,并开始为该会话分配资源。
之后,目标节点将返回一个200 OK消息表示会话建立成功。
发送节点收到200 OK消息后,将发送一个ACK消息确认会话建立成功。
如果发送节点需要修改会话参数,它可以发送一个UPDATE消息到目标节点。
目标节点收到UPDATE消息后,将根据需要修改会话参数,并返回一个200 OK消息确认修改成功。
如果发送节点想要终止会话,它可以发送一个BYE消息到目标节点。
目标节点收到BYE消息后,将返回一个200 OK消息表示会话终止成功。
SIP协议栈还支持其他功能,例如身份验证、位置服务和消息转发。
身份验证功能可以确保会话只能由合法用户建立和修改。
位置服务功能可以根据用户的位置信息将会话路由到合适的节点。
消息转发功能可以将SIP消息转发到其他网络中的节点。
总之,SIP协议栈是一种用于建立、修改和终止多媒体会话的通信协议。
协议栈的层次SIP为应用层(Application-Layer)的协议,所以不需要改变操作系统便可以支持。
SIP 已经获得3GPP (Third GenerationPartnership Project)、3GPP2 (Third Generation Partnership ProjectNumber 2)等机构认证,成为未来第三代行动通讯 (3G) 的标准。
下面是SIP的分层图示,IETF坚持分层,不同模块功能相对独立,各层之间松散耦合。
关于Resiprocate设计首先祭出这面大旗,”类是对概念的描述,面向接口编程;封装变化的概念。
”---这不是我讲的,是大师们的口水。
Resiprocate中大部分类就是对RFC3261各种SIP元素、组件的封装,并且也体现了RFC协议设计的层次。
在面向对象的设计中我们首先就要厘清问题域的所在;SIP Stack的设计就是要充分考虑完整展现RFC定义的各种元素和概念以及让这些独立而又关联的元素互动起来成为一个活的系统。
可以这样来考虑,比如我们知道RFC定义了一个SIP MESSAGE的概念;下面是从RFC文档拷贝的内容:SIP 消息 = 起始行*消息头部CRLF(空行)[消息体]因此SIP Message这个概念元素还包括了更多的元素和概念;SIP Message中我们能抽象出更通用的概念我们暂且叫它Message; 起始行的概念E文RequestLine以及Sattus Line又包括了很多消息头(这是包容的关系),SIPURL也包括消息头,等等,还有什么参数什么的元素呢;当我们在考虑和提炼这些概念和元素的时候,我们思考怎么抽象他们呢,它们又有什么基本的元素及其共性呢?他们之间的关系如何组织呢?esiprocate的源码告诉了我们如何去设计和封装这些概念的上佳实现。
在Resiprocate 中一些RFC3261中定义元素的对应:建议:利用CRC卡片的方式去记录理解Resiprocate中的大量的类及其关系。
CRC:类、职责、协作。
部分设计的理解:OBSERVER/VISITOR/COMMAND/ITERATOR模式,工厂模式(大量容器的使用也是一种变体如:DialogSet),代理类句柄类(界面实现分离,隐藏实现…),……大量的界面类(如AppXXX系列)是遵循大师BS“界面和实现分离”的原则吧;而句柄方式对对象的间接管理是老外的惯用伎俩啦,关于句柄设计从大师BS的著作到<<Effective C++>>的Handle_Body论和<<C++沉思录>>的大段描述再到<<C++ Model Design>>都有发挥和外延,感兴趣可以观之。
插播:源码中的大量Clone函数是模仿大师BS的虚拟构造函数一说也是原型模式的体现;源码中对同步的封装值得借鉴,其中有“资源开始即初始化”理论的体现;在DUM部分回调机制所遵循的著名“好莱坞原则”;句柄和代理的一个特点就是重载了operator->、operator*等;源码中也非常注重效率如Sip Core部分中大量Hash表的建立。
T* operator->(){return get();}const T* operator->() const{return get();}T& operator-> (){return *get();}const T& operator*() const{return *get();}Handled::Handled(HandleManager& ham) :mHam(ham),mId(Handled::npos){mId = mHam.create(this);}Handled::IdHandleManager::create(Handled* handled){mHandleMap[++mLastId] = handled;// typedef HashMap<Handled::Id, Handled*> HandleMap; //HandleMap mHandleMap;return mLastId;}1. SIP Stack分析1.1 Resiprocate SIP Stack系统架构图示1.2 FIFO流的走向图1.3 Sending datagram1.4 Process Incoming UDP2. Application/DUM设计浅析:抽象接口:CLASS HANDLED ,CLASS InviteSessionHandler(诸如此类)……对象之源:CLASS HANDLED(多态和控制的基础)……交互控制: CLASS Handle,CLASS HandleManager……概念封装成类典型:CLASS Dialog,CLASS DialogId,CLASS DialogSet,CLASS DialogSetId, CLASS InviteSession…..Utility工具类:CLASS BaseCreator , CLASS DestroyUsage, CLASS Profile……流动之源:DialogUsageManager::process(),Dialog::dispatch(const SipMessage& msg)……状态机的位置:DialogUsageManager::incomingProcess,DialogSet::dispatch,Dialog::dispatch在整个Resiprocate大家族中事务层概念的体现是TransactionUser类,而其真正的实现和管理类就是DialogUsageManager;从其:class DialogUsageManager : public HandleManager, public TransactionUser能看出来;HandleManager点出了DialogUsageManager的管理功能的本质,并且管理各种对象(Handle是各类对象的句柄)。
在整个Resiprocate系统中不管是我们发出或者收到的SIP Message都是放进了先进先出的队列然后不断轮询处理,这有点点点象Windows的消息系统,对应收发的消息DUM 提供事件通知的机制。
DUM利用事件回调模型,事件响应可以选择继承系列XXXHandler 抽象接口,并向TU注册,以实现VISITOR模式;我在另外的文档理也提到这是Reactor (Dispatcher,Notifier)模式,应用程序开发者只负责实现具体事件处理程序,并在反应器上注册它们 ----“好莱坞原则”。
DialogUsageManager是sip事务层管理类,是一个大总管的角色;看其Makexxx系列的函数能明白它能发起一系列登陆、会话邀请的动作及其回复。
Dum定义了很多句柄管理类,通过它我们能得到真实的对象,从而完成操作,这在事件响应中非常有用。
在Dum(DialogUsageManager)的类中基本上这样一条线(以INVITE为例):DialogUsageManager产生Dialog Set,Dialog Set产生Dialog,Dialog产生InviteSession; InviteSession又分Client InviteSession和Server InviteSession。
而上面的各个对象的PROCESS或者DISPATCH函数产生的各种状态的变化并触发相应事件。
在DUM的IM/PRESENSE部分广泛使用SUBSCRIBE/NOTIFY的模式,目前协议的定义似乎参照成熟的设计模式。
个人一直比较喜欢这段论述:session有两种含义,一种是传统意义上的RTP会话,一种是信令意义上的会话。
SIP 中的会话指后一种,在层次上它在dialog之上,也就是dialog可以看成session的组成单元。
二者的分别主要基于目前出现的subscription应用,对于session和subscription可以共享一个dialog,dialog由基本的会话标识组成,如Call-ID,From-Tag,To-Tag,以及一些目的target等共性单元组成。
而session除了具备这些单元外,包含INVITE建立起的会话其他内容,例如INVITE引起的状态机处理内容、PRACK处理记录等内容。
有一个最为重要的区别是:Session是完成了SDP的Offer-Answer过程,也就是此时双方可以进行双向的RTP传输了。
而Dialog只是双方建立了联系,这个联系是通过Dialog Context来记录的。
在Dialog状态下双方不一定可以作双向的RTP传输。
所以必定是Dialog在前,而Session在后,但两者可以同时一起建立。
Session是基于SDP Message的交互,没有SDP的交互,就没有Session。
而Dialog是基于请求消息中的Header Field进行交互。
因此两者在层次上也是不一样的。
下图是DUM中各种对象实例间的关系表示:DUM中几个重要的类图:3. RESIPROCATE SIP Core重要模块的简单介绍SipStack模块:SipStack是Sip Stack Core的面向外界的接口;可以说它是Sip Stack Core的外覆类(wraper)或者是界面类(以大师BS的观点来看),它是和外界交互的窗口和协议,具体的实现又分散到更具体的实现类和层次。
在整个的协议栈架构中SipStack出于承上启下的位置,它既面向DUM层(表现为向DialogUsageManager服务)又可以直接为外界(如UI)所用;列举其主要面向外界的接口函数:/**Adds a TU to the TU selection chain. Tu's do not call receive orreceiveAny, the SipStack will call postToTu on the appropriateTu. Messages not associated with a registered TU go into SipStack::mTuFifo.*/void registerTransactionUser(TransactionUser&);注释基本上已经讲的很清楚,我就补充其交互的细节吧。
这个函数基本上能让我们看到TU和SipStack交互间其visitor/observer模式的影子。
voidSipStack::registerTransactionUser(TransactionUser& tu){mTuSelector.registerTransactionUser(tu);}回溯SipStack的成员变量:/// Responsible for routing messages to the correct TU based on installed rulesTuSelector mTuSelector;把SipStack中的Trusaction User角色独立出来交与一个独立的类管理是个不错的选择。