oSIP开发者手册 (二)
第四章 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开发者手册 (二)相关推荐
- oSIP开发者手册 (四)
如何提高语法分析器的性能 提高栈的性能,你可以通过配置语法分析在连接时选取一些头部必须完全解码.(在运行时进行少量工作也是被允许的)在执行代理服务器时,你可以发现这对于 ...
- oSIP开发者手册 (三)
第三部分:扩展API 此部分的参数是很多字段的组成部分,例如"To"."From"."Contact"."Route& ...
- 《翻译》Intel 64 与 IA-32 架构软件开发者手册卷1翻译
<前言> 翻译自官方的PDF版手册,可以从下述站点下载英文原版: http://www.intel.com/content/www/us/en/processors/architectur ...
- MeterSphere开发者手册
什么是 MeterSphere MeterSphere 是一站式的开源企业级持续测试平台, 涵盖测试跟踪.接口测试.性能测试. 团队协作等功能,兼容 JMeter 等开源标准,有效助力开发和测试团队充 ...
- 万普平台Android版SDK开发者手册
万普平台Android版SDK开发者手册 (标准版Ver1.8.4) 平台简介 万普世纪移动营销服务平台(以下称为"万普平台")的Android 版SDK 提供了一套现成的开发包及 ...
- 带你实现开发者头条(二) 实现左滑菜单
title: 带你实现开发者头条(二) 实现左滑菜单 tags: 左滑菜单,android 自带侧滑,DrawerLayout grammar_cjkRuby: true --- 今天开始模仿开发者头 ...
- [导入][转]sap学习手册二
SAP学习手册二 作者:sunxufeng 有没有调整IDES4.6的中文包参数的步骤呢? 在导入中文包后直接手工修改有关参数,不要用CZ10去修改假定为D盘,路径为D:usrsapC11syspro ...
- Cocoa编程开发者手册
Cocoa编程开发者手册(Objective-C权威著作超一流翻译阵容) [美] 奇斯纳尔(Chisnall,D.) 著 霍炬等 译 ISBN 978-7-121-12239-2 2013年7月出版 ...
- Oracle使用手册(二)---流程控制
Oracle使用手册(二)---流程控制 --流程控制 --1. if..then..end if set serveroutput on declare i integer:=60; j in ...
最新文章
- c 使用matlab引擎,[转载]C与MATLAB混合编程之调用MATLAB引擎
- h计算机二级基础知识题库,计算机二级考试试题
- Angular--TypeScript finalize 方法
- android sqlitejian监听,tencent/sqlite.md · zhoujian/AndroidInterView - Gitee.com
- how is our class instance registered - thanks to AnnotationConfigWebApplicationC
- 汽车电子专业知识篇(四)-一文详解无人驾驶中的各种感知传感器
- python pip本地安装包_python-pip install 安装包
- 成功驱动5150用HT68F30
- 鹿邑2021高考成绩查询,鹿邑中考成绩查询2021
- Python的问题解决: IOError: [Errno 32] Broken pipe
- 暴风一号 病毒 源码学习
- xp系统远程桌面关闭计算机,Windows XP 使用远程桌面时的关机/重新启动方法
- Not Adjacent Matrix、Same Differences、Arranging The Sheep
- 纵享丝滑滑动切换的周月日历,水滴效果,可高度定制,仿小米日历
- 邱锡鹏《神经网络与深度学习》第一章 绪论
- 微信小程序与卡券功能小结
- 记一次360众测仿真实战靶场考核WP
- 研究生如何发表论文必读
- 手机rpg游戏存档在哪_在免费RPG日尝试新游戏
- LOL服务器维护奖励,LOL5.18版本改动内容 lol官网服务器维护公告
热门文章
- 什么是 Stack Overflow,什么情况下会造成 Stack Overflow
- Link方式安装eclipse插件
- Visual C# 打造 “浏览器”
- php 长剑设计模式,PHP设计模式(创建型)
- 网信办:网络音视频等平台不得诱导未成年人参与应援集资等活动
- 小米12 Ultra有望换装索尼传感器:牵手徕卡 搭载新一代影像旗舰
- 小红书重拳治理虚假种草 再起诉3家通告平台、MCN机构
- 90后过年,吃零下18度的年夜饭
- 高通:骁龙将成为独立的产品品牌
- 叮咚买菜更新招股书:发行价区间为23.5-25.5美元