第四章 oSIP语法分析器
      文件
      ./libosip-x.x.x/parser是SIP语法分析器的源代码目录。
      ./libosip-x.x.x是开发库的目录。
      #inlcude<osip/smsg.h>是一个包含SIP语法分析API的库文件。
      SIP-URL(SIP地址)
      URL定义的语法结构和设计目标
      URL被用于描述分布在SIP网络中的每一个实体:SIP用户代理、定位服务器、SIP代理服务器、SIP重定向服务器等等。这些实体都要有他们完整的SIP
      URL进行标识。在开发库中用url_t格式去定义如下字段:”To”、”From”、”Contact”、”Route”和”Record-Route”;list_t扩展定义了url中包含的固定参数和不固定的头部值。
      SIP URL的结构定义:
      typedef struct _sipurl_t{
      char *scheme;
      char *username;
      char *password;
      char *host;
      char *port;
      list_t *url_params;
      list_t *url_headers;
      }url_t
      url_t结构体操作的API
      url_init
      [功能描述]
      分配内存,并对结构体作初始化。(在下面的API中将会有很多的初始化函数。一般而言,分配内存调用malloc,释放内存调用free,由于作者做了改写使的调用的函数分别为smalloc和sfree,初赋值做的就是将一些变量赋值为0或NULL)。
      [参数描述]
      int url_init(url_t **url);
      成功返回0,失败会使程序自动退出。
      
      url_free
      [功能描述]
      释放操作完成的url_t结构,并对url_t结构中的变量赋值为空。
      [参数描述]
      void url_free(url_t *url);
      
      url_parse
      [功能描述]
      分解输入的串信息,并赋值到已定义的url_t结构变量当中。
      [参数描述]
      int url_parse(url_t *url,char *filed_value);
      成功返回0,失败返回-1,后面函数返回值大体如此定义。
      
      url_2char
      [功能描述]
      将一个url_t中的结构化信息转化并组合赋值给一个字符串。
      [参数描述]
      int url_2char(url_t *url,char **field_value);
      成功返回0。
      char **field_value会在url_2char中做初始化。
      
      url_clone
      [功能描述]
      进行两个url_t结构实例的复制(使用标准函数memcpy也可以完成,但对于链表不一定可以,未曾测试)。
      [参数描述]
      int url_clone(url_t *url,url_t **dest);
      成功返回0,失败返回-1。
      
      url_setscheme
      url_setusername
      url_setpassword
      url_sethost
      url_setport
      [功能描述]
      设定url当中的摘要部分、用户名、密码、主机和端口
      [参数描述]
      void url_setscheme(url_t *url, char *scheme);
      void url_setusername(url_t *url, char *username);
      void url_setpassword(url_t *url, char *password);
      void url_sethost(url_t *url, char *host);
      void url_setport(url_t *url, char *port);
      
      url_getscheme
      url_getusername
      url_getpassword
      url_gethost
      url_getport
      [功能描述]
      获取url当中的一些特定部分的值,并返回。
      [参数描述]
      char* url_getscheme(url_t *url);
      char* url_getusername(url_t *url);
      char* url_getpassword(url_t *url);
      char* url_gethost(url_t *url);
      char* url_getport(url_t *url);
      
      其它相关有用的函数API
      #define url_set_transport_udp(U)   url_param_add(U->url_params,
      "transport", "udp")
      #define url_set_transport_tcp(U)   url_param_add(U->url_params,
      "transport", "tcp")
      #define url_set_transport_sctp(U)  url_param_add(U->url_params,
      "transport", "sctp")
      #define url_set_transport_tls(U)   url_param_add(U->url_params,
      "transport", "tls")
      #define url_set_transport(U,T)     url_param_add(U->url_params,
      "transport", T)
      
      #define url_set_user_phone(U)     url_param_add(U->url_params, "user",
      "phone")
      #define url_set_user_ip(U)        url_param_add(U->url_params, "user",
      "ip")
      #define url_set_user(U, USER)     url_param_add(U->url_params, "user",
      USER)
      
      #define url_set_method_invite(U)  url_param_add(U->url_params, "method",
      "INVITE")
      #define url_set_method_ack(U)     url_param_add(U->url_params, "method",
      "ACK")
      #define url_set_method_options(U) url_param_add(U->url_params, "method",
      "OPTIONS")
      #define url_set_method_bye(U)     url_param_add(U->url_params, "method",
      "BYE")
      #define url_set_method_cancel(U)  url_param_add(U->url_params, "method",
      "CANCEL")
      #define url_set_method_register(U) url_param_add(U->url_params,"method",
      "REGISTER")
      #define url_set_method(U, M)      url_param_add(U->url_params, "method",
M)
      #define url_set_ttl(U, T)         url_param_add(U->url_params, "ttl", T)
      #define url_set_maddr(U, M)       url_param_add(U->url_params, "maddr", M)
      这些函数都是必要理解的(参照osip/urls.h)
      
      url_param_t和url_header_t操作的API
      你可以参考前面细述的关于参数和头部值之间的区别。在下面的描述的param的函数中,你只要将param换为header,即可完成对url_header_t的操作。这些函数完成了对结构的初始化、分解、设定和克隆等操作。
      param参数的结构定义如下:
      typedef struct _url_parm_t{
      char *gname;
      char *gvalue;
      }url_param_t;
      header参数的结构定义如下:
      typedef struct _url_parm_t{
      char *gname;
      char *gvalue;
      }url_header_t
      
      url_param_init
      [功能描述]
      初始化url_param_t结构。
      [参数描述]
      int url_param_init(url_param_t **url_param);
      成功返回0。
      
      url_param_free
      [功能描述]
      释放url_param所对应url_param_t结构实例。
      [参数描述]
      int url_param_free(url_param_t *url_param);
      成功返回0。
      
      url_param_set
      [功能描述]
      将字符串pname(参数名)和pvalue(参数名所对应的值)赋值到url_param_t结构当中。
      [参数描述]
      void url_param_set(url_param_t *url_param,char *pname,char *pvalue);
      
      url_param_add
      [功能描述]
      添加一个赋值好的url_param_t结构到url_t里面的参数列表当中。
      [参数描述]
      int url_param_add(list_t *url_params,char *pname,char *pvalue);
      成功返回0,失败返回-1。
      
      url_param_freelist
      [功能描述]
      释放url_t中的参数列表结构。
      [参数描述]
      void url_param_freelist(list_t *url_params);
      
      url_param_getbyname
      [功能描述]
      在list_t列表中寻找含有pname的url_param,并将此参数对应关系值赋给url_param_t
      **url_param。最终结果存放在url_param_t **url_param中。
      [参数描述]
      void url_param_getbyname(list_t *url_params,char *pname,url_param_t
      **url_param)
             
      下面给出两个对于参数和头部值非常重要的操作函数:
      int url_uparam_add(url_t *url,char *pname,char *pvalue)
      #define url_uparam_add(F,N,V) url_param_add(F->url_params,N,V)
      int url_uparam_getbyname(url_t *url,char *pname,url_param_t **url_param)
      #define url_uparam_getbyname(F,N,UH) url_param_getbyname(F->url_params,
      N,UH)
      对于使用param,请仔细参考标准rfc2543。
      SIP headers操作的API
      在rfc2543中定义了大约40个字段。SIP
      Message(SIP消息)就是由这一系列的字段排列构成的。在下面的API定义分三部分划分并阐述,第一部分API用于创建、分配、分析和打印SIP的头部元素;第二部分展示某头部特有的API,在这里我仅仅展示”to”所特有的函数;第三部分是一些扩展的API,其不仅适合于”to”字段,同样适合于”From”、”Contact”、”Route”、”Record-Route”和其他头部,着提供了头部的扩展性。
      To的结构定义如下:
      typedef struct _to_t{
      char *displayname;
      url_t *url;
      list_t *gen_params;
      }to_t;
      SIP语法分析器能够分析如下头部:Via、To、From、Cseq、Call-Id、Contact、Route、Record-Route、Content-Type、Content-Length、Mime-Version。其他头部通过特殊的API以串的格式存取。
      你可以潜意识的将”to_”替换为下面的值”via_”、”from_”、”cseq_”、”call_id_”、”contact_”、”route_”、”record_route_”、”content_type_”、”content_length_”、”mime_version_”。

如果你想细致了解每一个字段的结构定义,请阅读osip/smsgtypes.h;想了解字段对应的函数,请阅读osip/smsg.h库文件,其对于功能描述、参数描述和使用描述都会有深入的理解。
      第一部分:创建、分配、分析和打印SIP的头部元素
      to_init
      [功能描述]
      对to字段进行初始化。
      [参数描述]
      int to_init(to_t **to);
      成功返回0,不必做失败判断处理。
      
      to_free
      [功能描述]
      释放to字段。
      [参数描述]
      void to_free(to_t *to);
      
      to_2char
      [功能描述]
      将to结构转化赋值给一个字符串。
      [参数描述]
      int to_2char(to_t *to,char *filed_value);
      成功返回0,失败返回-1。
      
      to_clone
      [功能描述]
      将to信息克隆到目标
      [参数描述]
      int to_clone(to_t *to,to_t **dest);
      
      第二部分:To特有的API
      to_setdisplayname
      [功能描述]
      设定to字段里面的display name。
      [参数描述]
      void to_setdisplayname(to_t *to,char *value);
      
      to_getdisplayname
      [功能描述]
      从to字段中提取display name并返回。
      [参数描述]
      char *to_getdisplayname(to_t *to);
      
      to_seturl
      [功能描述]
      在to字段当中设定url值。
      [参数描述]
      void to_seturl(to_t *to,url_t *url);
      
      to_geturl
      [功能描述]
      从to字段中提取url值。
      [参数描述]
      url_t *to_geturl(to_t *to);
      
      to_param_add
      [功能描述]
      在to字段中增加一个gen_param
      [参数描述]
      int to_param_add(to_t *to,char *name,char *value);
      成功返回0,失败返回-1。
      注意:
      #define to_param_add(T,N,V) generic_param_add((T)->gen_params,N,V)
      
      to_param_get
      [功能描述]
      选取to结构里面list_t的第pos的内容。
      [参数描述]
      int to_param_get(to_t *to,int pos,generic_param_t **gp);
      成功返回pos,失败返回-1;
      注意:
      #define to_param_get(T,I,GP) from_param_get((from_t*)T, I, GP)
      
      to_settag
      [功能描述]
      在to字段内设定tag的值。
      [参数描述]
      void to_settag(to_t *to,char *tag)
      注意:
      #define to_set_tag(T,V) generic_param_add((T)->gen_params, "tag",V)
      
      to_gettag
      [功能描述]
      将to结构中的tag值,返回成generic_param_t结构
      [参数描述]
      void to_gettag(to_t *to,generic_param_t **dest);
      #define to_gettag(T,GP) generic_param_getbyname((T)->gen_params,
      sgetcopy("tag"),GP)
      
      to_param_getbyname
      [功能描述]
      在to字段中寻取参数名为pname的值
      [参数描述]
              int to_param_getbyname(to_t *to,char *pname,generic_param_t
**dest)
              成功返回0
      #define to_param_getbyname(T,N,GP)
      generic_param_getbyname((T)->gen_params,N,GP)
       
                                                                                                       [ 内容来自网络]

oSIP开发者手册 (二)相关推荐

  1. oSIP开发者手册 (四)

    如何提高语法分析器的性能                 提高栈的性能,你可以通过配置语法分析在连接时选取一些头部必须完全解码.(在运行时进行少量工作也是被允许的)在执行代理服务器时,你可以发现这对于 ...

  2. oSIP开发者手册 (三)

    第三部分:扩展API       此部分的参数是很多字段的组成部分,例如"To"."From"."Contact"."Route& ...

  3. 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译

    <前言> 翻译自官方的PDF版手册,可以从下述站点下载英文原版: http://www.intel.com/content/www/us/en/processors/architectur ...

  4. MeterSphere开发者手册

    什么是 MeterSphere MeterSphere 是一站式的开源企业级持续测试平台, 涵盖测试跟踪.接口测试.性能测试. 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和测试团队充 ...

  5. 万普平台Android版SDK开发者手册

    万普平台Android版SDK开发者手册 (标准版Ver1.8.4) 平台简介 万普世纪移动营销服务平台(以下称为"万普平台")的Android 版SDK 提供了一套现成的开发包及 ...

  6. 带你实现开发者头条(二) 实现左滑菜单

    title: 带你实现开发者头条(二) 实现左滑菜单 tags: 左滑菜单,android 自带侧滑,DrawerLayout grammar_cjkRuby: true --- 今天开始模仿开发者头 ...

  7. [导入][转]sap学习手册二

    SAP学习手册二 作者:sunxufeng 有没有调整IDES4.6的中文包参数的步骤呢? 在导入中文包后直接手工修改有关参数,不要用CZ10去修改假定为D盘,路径为D:usrsapC11syspro ...

  8. Cocoa编程开发者手册

    Cocoa编程开发者手册(Objective-C权威著作超一流翻译阵容) [美] 奇斯纳尔(Chisnall,D.)  著 霍炬等 译 ISBN 978-7-121-12239-2 2013年7月出版 ...

  9. Oracle使用手册(二)---流程控制

    Oracle使用手册(二)---流程控制 --流程控制 --1. if..then..end if  set serveroutput on  declare  i integer:=60; j in ...

最新文章

  1. c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎
  2. h计算机二级基础知识题库,计算机二级考试试题
  3. Angular--TypeScript finalize 方法
  4. android sqlitejian监听,tencent/sqlite.md · zhoujian/AndroidInterView - Gitee.com
  5. how is our class instance registered - thanks to AnnotationConfigWebApplicationC
  6. 汽车电子专业知识篇(四)-一文详解无人驾驶中的各种感知传感器
  7. python pip本地安装包_python-pip install 安装包
  8. 成功驱动5150用HT68F30
  9. 鹿邑2021高考成绩查询,鹿邑中考成绩查询2021
  10. Python的问题解决: IOError: [Errno 32] Broken pipe
  11. 暴风一号 病毒 源码学习
  12. xp系统远程桌面关闭计算机,Windows XP 使用远程桌面时的关机/重新启动方法
  13. Not Adjacent Matrix、Same Differences、Arranging The Sheep
  14. 纵享丝滑滑动切换的周月日历,水滴效果,可高度定制,仿小米日历
  15. 邱锡鹏《神经网络与深度学习》第一章 绪论
  16. 微信小程序与卡券功能小结
  17. 记一次360众测仿真实战靶场考核WP
  18. 研究生如何发表论文必读
  19. 手机rpg游戏存档在哪_在免费RPG日尝试新游戏
  20. LOL服务器维护奖励,LOL5.18版本改动内容 lol官网服务器维护公告

热门文章

  1. 什么是 Stack Overflow,什么情况下会造成 Stack Overflow
  2. Link方式安装eclipse插件
  3. Visual C# 打造 “浏览器”
  4. php 长剑设计模式,PHP设计模式(创建型)
  5. 网信办:网络音视频等平台不得诱导未成年人参与应援集资等活动
  6. 小米12 Ultra有望换装索尼传感器:牵手徕卡 搭载新一代影像旗舰
  7. 小红书重拳治理虚假种草 再起诉3家通告平台、MCN机构
  8. 90后过年,吃零下18度的年夜饭
  9. 高通:骁龙将成为独立的产品品牌
  10. 叮咚买菜更新招股书:发行价区间为23.5-25.5美元