http://sofia-sip.sourceforge.net/refdocs/nta/index.html,翻译自官网的这张网页。
模块元信息
Sofia SIP Transaction API (nta)提供针对SIP事务、传输和消息处理的简单接口。nta接口计划是网络和用户元素(need translate again)。nta的公开接口在<sofia-sip/nta.h>头文件中定义,tag参数在<sofia-sip/nta_tag.h>头文件中定义。
-
联系人:
- Pekka Pessi < Pekka.Pessi@nokia-email.address.hidden>
-
状态:
- Sofia SIP Core library
-
许可:
- LGPL
NTA Objects
NTA处理很多类对象:agent (nta_agent_t),call legs (nta_leg_t),客户端外呼请求(nta_outgoing_t),呼入的服务端请求(nta_incoming_t)。
NTA使用SIP消息对象msg_t和sip_t来处理消息,分别在<sofia-sip/msg.h>和<sofia-sip/sip.h>头文件中定义。SIP头都在<sofia-sip/sip.h>头文件中定义。
创建NTA代理
大部分的SIP实体,用户代理或网关,都由SIP服务器和SIP客户端协同工作组成。NTA提供nta_agent_t对象提供SIP服务器和客户端的简单接口。
调用nta_agent_create()函数将创建一个nta_agent_t对象。对象监听着传入的连接,接收消息,解析它们,并且将它们传递给应用程序。它还负责解析域名以及发送消息。
代理需要su_root_t对象来调度它自身的执行。root对象被用来等待网络事件,调度定时器函数,异步传递消息。root对象可通过su_root_create()函数创建。root对象可以有它自己的线程,或者它的主循环过程由其他应用程序线程通过调用su_root_run()函数来执行。主循环过程可以通过调用su_root_break()函数结束它。
一个简单的代理可以像如下这样来创建:
registrar->reg_root = su_root_create(NULL); if (registrar->reg_root) { registrar->reg_agent = nta_agent_create(registrar->reg_root, (url_string_t*)argv[1], NULL, NULL, NULL); if (registrar->reg_agent) { su_root_run(registrar->reg_root); nta_agent_destroy(registrar->reg_agent); } su_root_destroy(registrar->reg_root); }
SIP服务器动作
SIP服务器会响应客户端发起的事务。SIP服务器可在两种模式下运作:无状态和有状态。这一节描述一个有状态的SIP服务器如何使用NTA。
NTA腿
一条腿用来表示有状态的事务处理。腿缺省这么被创建:
default_leg = nta_leg_tcreate(agent, process_requests, context, URLTAG_URL(url), NTATAG_NO_DIALOG(1), TAG_END());
url参数用来指定哪个URLs匹配这条腿。如果给出了url,只有那些requestURI匹配这个参数的请求才会被这条腿处理。nta_leg_tcreate() 函数也是一个tag参数函数,接收tagged参数列表。
正常的腿可被用来匹配已经存在的会话、通话或事务上下文的呼入请求,或提供有着连续头的呼出请求。当一个通话的腿被创建,From和To头会被提供给它,其他的头也可选择性地提供给它,例如Call-ID、Route或CSeq。
一个新的腿像这样被创建:
call_leg = nta_leg_tcreate(agent, process_call_requests, call_context,