➤soap结构中count(soap->count)成员

soap结构中count(soap->count)成员记录的是http协议中Content-Length的数值。

➤keep_alive

keep_alive既是在通讯过程中的正常链接的一个状态标示也是关系到http协议中Connection:keep-alive的填写open还是close。

➤如何生成http协议部分

gsoap中生成的*.c文件中在生成xml协议信息时,是通过soap->fposthdr,soap_puthttphdr生成一些http协议部分。

➤如何发送http协议

在gsoap通讯过程中,通过soap->fpost(),生成发送协议中的http协议部分。

➤函数soap_set_local_namespaces(struct soap *soap)

➣soap_connect()函数中把原来的soap->mode进行了修改,这样在下次调用,同时对填入soap->buf的字符进行计数。

➣soap_connect()中soap->bufidx统计的是http协议部分的字符数。

➣soap_envelope_begin_out()统计envelope部分的计数,同时填写xml中envelope部分

➣soap_putheader()统计putheader部分的计数,同时填写xml中putheader部分。

➣soap_body_begin_out()统计body部分的计数,同时填写xml中body部分。

➣soap_put___tds__(*)(*标示相关功能标识,例如GetNetworkInterfaces)统计__(*)(*标示相关功能标识,例如GetNetworkInterfaces)部分的计数,同时填写xml中__(*)(*标示相关功能标识,例如GetNetworkInterfaces)部分。

➣soap_body_end_outconnect()中soap->bufidx统计的是body部分结束标签的字符数同时把结束标签写入xml。

➣soap_envelope_end_out()同前。

➣soap_end_send()中,soap_end_send()->soap_flush()->soap_flush_raw()->soap->fsend(),在函数soap_end_send()中进行sock发送,在此函数中第一次使用soap结构(接受/发送结束),对soap->budidx,soap->count进行清零。在此之前结构中soap->buflen一次未用到,猜测次成员只在解析时使用。在这些处理过程中,如果(soap->bufidx > SOAP_BUFLEN),那么,由于soap_connect()已经建立了socket通讯,所以只要条件满足就用soap->flush()把buf中的协议包发送给服务器端,不会丢失协议内容,至于服务器端怎样处理,只有读代码了。

➤soap_element()

#ifndef PALM_2
SOAP_FMAC1
int
SOAP_FMAC2
soap_element(struct soap *soap, const char *tag, int id, const char *type)
{
#ifndef WITH_LEAN
const char *s;
#endif
DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Element begin tag='%s' level='%u' id='%d' type='%s'\n", tag, soap->level, id, type ? type : SOAP_STR_EOS));
#ifdef WITH_DOM
#ifndef WITH_LEAN
if (soap_tagsearch(soap->wsuid, tag))
{ size_t i;
for (s = tag, i = 0; *s && i < sizeof(soap->tag) - 1; s++, i++)
soap->tag[i] = *s == ':' ? '-' : *s;
soap->tag[i] = '\0';
if (soap_set_attr(soap, "wsu:Id", soap->tag, 1))
return soap->error;
}
#endif
#endif
soap->level++;
if (soap->level > soap->maxlevel)
return soap->error = SOAP_LEVEL;
#ifdef WITH_DOM
#ifndef WITH_LEAN
if ((soap->mode & SOAP_XML_CANONICAL) && !(soap->mode & SOAP_DOM_ASIS))
{ if (soap->evlev >= soap->level)
soap->evlev = 0;
if (soap->event == SOAP_SEC_BEGIN && !soap->evlev)
{ struct soap_nlist *np;
/* non-nested wsu:Id found: clear xmlns, re-emit them for exc-c14n */
for (np = soap->nlist; np; np = np->next)
{ int p = soap_tagsearch(soap->c14ninclude, np->id) != NULL;
if (np->index == 2 || p)
{ struct soap_nlist *np1 = soap_push_ns(soap, np->id, np->ns, 1, 0);
if (np1 && !p)
np1->index = 0;
}
}
soap->evlev = soap->level;
}
}
#endif
if (soap->mode & SOAP_XML_DOM)
{ struct soap_dom_element *elt = (struct soap_dom_element*)soap_malloc(soap, sizeof(struct soap_dom_element));
if (!elt)
return soap->error = SOAP_EOM;
DBGLOG(TEST, SOAP_MESSAGE(fdebug, "Adding DOM element tag='%s' %p (parent='%s' %p)\n", tag, elt, soap->dom ? soap->dom->name : "(null)", soap->dom));
elt->soap = soap;
elt->next = NULL;
elt->prnt = soap->dom;
elt->elts = NULL;
elt->atts = NULL;
elt->nstr = NULL;
elt->name = soap_strdup(soap, tag);
elt->lead = NULL;
elt->text = NULL;
elt->code = NULL;
elt->tail = NULL;
elt->node = NULL;
elt->type = 0;
if (soap->dom)
{ struct soap_dom_element *p = soap->dom->elts;
if (p)
{ while (p->next)
p = p->next;
p->next = elt;
}
else
soap->dom->elts = elt;
}
soap->dom = elt;
if (!elt->name)
return soap->error = SOAP_EOM;
}
else
{
#endif
#ifndef WITH_LEAN
if (!soap->ns)
{ if (!(soap->mode & SOAP_XML_CANONICAL) && soap_send(soap, soap->prolog))
return soap->error;
}
else if (soap->mode & SOAP_XML_INDENT)
{ if (soap->ns == 1 && soap_send_raw(soap, soap_indent, soap->level < sizeof(soap_indent) ? soap->level : sizeof(soap_indent) - 1))
return soap->error;
soap->body = 1;
}
if ((soap->mode & SOAP_XML_DEFAULTNS))
{ size_t n = 0;
s = strchr(tag, ':');
if (s)
n = s++ - tag;
else
s = tag;
if (soap_send_raw(soap, "<", 1)
|| soap_send(soap, s))
return soap->error;
if (n)
{ struct Namespace *ns = soap->local_namespaces;
for (; ns && ns->id; ns++)
{ if (*ns->id && ns->ns && !strncmp(ns->id, tag, n) && !ns->id[n])
{ if (!soap->nlist || *soap->nlist->id || strcmp(soap->nlist->ns, ns->ns))
{ soap_push_ns(soap, SOAP_STR_EOS, ns->out ? ns->out : ns->ns, 0, 0);
if (soap_attribute(soap, "xmlns", ns->out ? ns->out : ns->ns))
return soap->error;
}
break;
}
}
}
else if (!soap->nlist || *soap->nlist->id || *soap->nlist->ns)
{ soap_push_ns(soap, SOAP_STR_EOS, SOAP_STR_EOS, 0, 0);
if (soap_attribute(soap, "xmlns", SOAP_STR_EOS))
return soap->error;
}
}
else
#endif
if (soap_send_raw(soap, "<", 1)
|| soap_send(soap, tag))
return soap->error;
#ifdef WITH_DOM
}
#endif
if (!soap->ns)
{ struct Namespace *ns = soap->local_namespaces;
int k = -1;
if (ns)
{ while (k-- && ns->id)
{ const char *t = ns->out;
if (!t)
t = ns->ns;
if (*ns->id && t && *t)
{ (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), strlen(ns->id) + 6), "xmlns:%s", ns->id);
if (soap_attribute(soap, soap->tmpbuf, t))
return soap->error;
}
ns++;
}
}
}
soap->ns = 1; /* namespace table control: ns = 0 or 2 to start, then 1 to stop dumping the table */
#ifndef WITH_LEAN
if ((soap->mode & SOAP_XML_CANONICAL))
{ if ((soap->mode & SOAP_XML_DEFAULTNS))
soap_utilize_ns(soap, SOAP_STR_EOS, 0);
else
soap_utilize_ns(soap, tag, 0);
}
#endif
if (id > 0)
{ (SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf), sizeof(SOAP_BASEREFNAME) + 20), SOAP_BASEREFNAME "%d", id);
if (soap->version == 2)
{ if (soap_attribute(soap, "SOAP-ENC:id", soap->tmpbuf))
return soap->error;
}
else if (soap_attribute(soap, "id", soap->tmpbuf))
return soap->error;
}
if (type && *type && !(soap->mode & SOAP_XML_NOTYPE))
{ const char *t = type;
#ifndef WITH_LEAN
if ((soap->mode & SOAP_XML_CANONICAL))
soap_utilize_ns(soap, type, 0);
#endif
if (soap_attribute(soap, "xsi:type", t))
return soap->error;
}
if (soap->null && soap->position > 0 && soap->version == 1)
{ int i;
(SOAP_SNPRINTF(soap->tmpbuf, sizeof(soap->tmpbuf) - 1, 20), "[%d", soap->positions[0]);
for (i = 1; i < soap->position; i++)
{ size_t l = strlen(soap->tmpbuf);
(SOAP_SNPRINTF(soap->tmpbuf + l, sizeof(soap->tmpbuf) - l - 1, 20), ",%d", soap->positions[i]);
}
(void)soap_strncat(soap->tmpbuf, sizeof(soap->tmpbuf), "]", 1);
if (soap_attribute(soap, "SOAP-ENC:position", soap->tmpbuf))
return soap->error;
}
if (soap->mustUnderstand)
{ if (soap->actor && *soap->actor)
{ if (soap_attribute(soap, soap->version == 2 ? "SOAP-ENV:role" : "SOAP-ENV:actor", soap->actor))
return soap->error;
}
if (soap_attribute(soap, "SOAP-ENV:mustUnderstand", soap->version == 2 ? "true" : "1"))
return soap->error;
soap->mustUnderstand = 0;
}
if (soap->encoding)
{ if (soap->encodingStyle && soap->local_namespaces && soap->local_namespaces[0].id && soap->local_namespaces[1].id)
{ if (!*soap->encodingStyle)
{ if (soap->local_namespaces[1].out)
soap->encodingStyle = soap->local_namespaces[1].out;
else
soap->encodingStyle = soap->local_namespaces[1].ns;
}
if (soap->encodingStyle && soap_attribute(soap, "SOAP-ENV:encodingStyle", soap->encodingStyle))
return soap->error;
}
else
soap->encodingStyle = NULL;
soap->encoding = 0;
}
soap->null = 0;
soap->position = 0;
return SOAP_OK;
}
#endif
 

黑体字标示的地方,作用是吧ns2为首地址的各个成员指针指向在*.nsmap中的。

➤SOAP_NMAC struct Namespace namespaces[]{...}定义成员

soap_attribute(){}函数是填写/处理xml协议中的"<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP-ENC="http://www.w3.org/2003/05/soap-encoding" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa5="http://www.w3.org/2005/08/addressing" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xmime="http://tempuri.org/xmime.xsd" xmlns:tt="http://www.onvif.org/ver10/schema" xmlns:tds="http://www.onvif.org/ver10/device/wsdl" xmlns:ter=">"类似xmlns:SOAP-ENV这些信息。

➤soap_element_begin_out()

填写/处理一个标签的开始部分,包括它的属性信息,例如:

xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope

{

.............

soap_element()函数填写/处理一个xml节点标签的从“<”开始到">"之前的所有信息,

..............

soap_element_start_end_out()函数填写/处理同一xml节点标签的">".

.................

}

➤soap_putheader()

该函调用soap_out_SOAP_ENV__Header()

soap_out_SOAP_ENV__Header()
{//用于处理(填写)xml中的soapheader部分标签
if (soap_element_begin_out()){//填写/处理header的开始标签
}
if (soap_out__wsa__MessageID()){
//soap_out__wsa__MessageID()==soap_out_string(){
//soap_outstring(){
// id = soap_element_id()//该id值可以是soap->malloc动态分配的空间在soap机构中struct soap_plist *pht[SOAP_PTRHASH];链表中的id值
//
}
//}
}
}
 

➤SOAP_FMAC5 int SOAP_FMAC6 soap_call___tds__(*)(例如GetNetworkInterfaces){

}

该函数用于最顶层的调用函数功能,具体包含实现了设备所具有的所有功能

➤soap_default__<*>()

<*>代表相应的功能函数标识, 例如soap_default__tds__GetNetworkInterfacesResponse,该函数仅仅是对恢复结构进行初始化。

➤soap_begin_count()

该函数在再次soap结构中一些在该请求中要用到和可能用到的量进行清零/初始化,最主要是的设置xml结构的mode信息默认情况下是soap->mode=0x20008;

➤soap_begin_recv()

soap_begin_recv()
{
.......//前面在进行一些在接收/解析过程中的用到的一些数据的初始化/清理
c = soap_getchar(soap);/*第一次进行接收数据,然而即使这次数据量为零,也 没有关 系,因为在后面的soap_envelope_begin_in()等函数中可以再次接收,也就是说第一次接收到数据量为0或者没有接收完完整的协议内容也可以在后面的soap_envelope_begin_in()等这些函数中继续接收,只要soap->socket不释放掉就可以.其中soap->buflen中记录了一次接收到的数据的字符统计数字,同时soap->count统计总的接收到的字符数.soap->bufidx = 0;soap->buflen = ret = soap->frecv()在每次socket接收前对soap->budidx进行清零;每次在soap_getchar(struct soap *soap){.......return soap_get1(soap);}之前对soap->ahead进行清零/处理;整理得知:soap_getchar()->soap_get1()->soap_recv()/return (unsigned char)soap->buf[soap->bufidx++];->soap_recv_raw(soap)->soap->frecv()*/
......//这里是些宏选择代码
while (soap_blank(c))//Ⅰ) Ⅱ) Ⅲ) 这三句代码目的:找到第一次接收到的数据信息中从soap->buf[0]开始的第一个不是0x00-0x20之间asii码之间的字符
c = soap_getchar(soap);
.....//通过一系列的if()判断后从接收到的buf中找打第一个符合协议的要求的字符,这个字符存储在c变量中.然后把这个符合协议要求起始字符存储在soap->ahead中(存储的是ASII码).
soap->error = soap->fparse(soap);//解析出http协议部分.
}
 

➤soap_envelope_begin_in()

soap_envelope_begin_in()
{//对指定的协议标识字符串进行解析, 例如SOAP-ENV:Envelope
if (soap_element_begin_in(soap, "SOAP-ENV:Envelope", 0, NULL)){
//soap_element_begin_in()=>if (!soap_peek_element(soap)){//soap_peek_element主要目的是在xml中找到相应的匹配字符串.例如SOAP-ENV:Envelope,存储在soap->tag中
..............
soap_unget(soap, c);//获取到第一个xml协议的第一个"<"
................
while (soap_blank(c))
c = soap_get(soap););//把xml协议的头部信息过滤掉.即:<?xml .....?>
....................
s = soap->tag;
do c = soap_get1(soap);
while (soap_blank(c));
i = sizeof(soap->tag);
while (c != '>' && c != '/' && soap_notblank(c) && (int)c != EOF)
{ if (--i > 0)
*s++ = (char)c;
c = soap_get1(soap);
}
while (soap_blank(c))
c = soap_get1(soap);
*s = '\0';//这几行把要解析的目标在xml中找到,即:"SOAP-ENV:Envelope"
...........
soap_pop_namespace(soap);//根据soap结构定义,可能和首选什么命名空间有关,在命令中也许和-n/-N有关,不确定.在测试中它返回值为NULL,即soap->nlist=NULL
........//后面紧接着是对命名空间的解析过程,同时对soap->body进行赋值if (!(soap->body = (c != '/')))
}
}
}
 

➤soap_recv_header()

把xml数据中的相应解析得到数据放置在在soap->header中

➤soap_body_begin_in()

与前面的连个函数相似功能.

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

 
 
 
 

onvif 开发中的一些重要函数介绍的更多相关文章

  1. iOS开发中常用的数学函数

    iOS开发中常用的数学函数 /*---- 常用数学公式 ----*/ //指数运算 3^2 3^3 NSLog(,)); //result 9 NSLog(,)); //result 27 //开平方 ...

  2. pytorch中squeeze()和unsqueeze()函数介绍

    一.unsqueeze()函数 1. 首先初始化一个a 可以看出a的维度为(2,3) 2. 在第二维增加一个维度,使其维度变为(2,1,3) 可以看出a的维度已经变为(2,1,3)了,同样如果需要在倒 ...

  3. [xPlugins] 开发中常用富文本编辑器介绍

    富文本编辑器学习,常见富文本编辑器有: CKeditor(FCkeditor).UEditor(百度推出的).NicEdit.KindEditor CKEditor 即 FCKEditor FCKed ...

  4. oracle中110个常用函数介绍

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  5. 如何在前端模版引擎开发中避免使用eval函数

    前段时间,想着自己写一个简单的模版引擎,便于自己平时开发demo时使用.于是根据自己对模版引擎的理解,定义自己的模版格式,然后,根据自己定义的格式,编写处理函数,将模版标签中的字符串,解析成可执行的字 ...

  6. IOS开发中的几种设计模式介绍

    ios开发学习中,经常弄不清楚ios的开发模式,今天我们就来进行简单的总结和探讨~ (一)代理模式 应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现. 优势:解耦合 敏捷 ...

  7. ios app 开发中ipa重新签名步骤介绍-备

    作为一个app应用程序开发者,在app应用程序在苹果商店上架前总需要将安装包安装到ios机器上进行测试,这个时候我们就需要打包in house版本的ipa了,打包in house实际上是一个将ipa应 ...

  8. Javascript中的高阶函数介绍

    高阶函数:高阶看上去就像是一种先进的编程技术的一个深奥术语,一开始我看到的时候我也这样认为的. Javascript的高阶函数 然而,高阶函数只是将函数作为参数或返回值的函数.以下面的Hello,Wo ...

  9. 关于js开发中保留小数位计算函数(以向上取整或向下取整的方式保留小数)

    前端工作中经常遇到数字计算保留小数问题,由于不是四舍五入的方式不能使用toFixed函数,本文采用正则表达式匹配字符串的方式,解决对数字的向上或向下保留小数问题: 1.向上保留小数(只要目标小数位后有 ...

随机推荐

  1. Spark RDD——combineByKey

    为什么单独讲解combineByKey? 因为combineByKey是Spark中一个比较核心的高级函数,其他一些高阶键值对函数底层都是用它实现的.诸如 groupByKey,reduceByKey ...

  2. 理解 CSS 中的伪元素 :before 和 :after

    CSS 的主要目的是给 HTML 元素添加样式,然而,在一些案例中给文档添加额外的元素是多余的或是不可能的.事实上 CSS 中有一个特性允许我们添加额外元素而不扰乱文档本身,这就是“伪元素”. 你一定 ...

  3. 20155335俞昆《Java程序设计》第五周总结

    #  20155335    <Java程序设计>第五周学习总结 ##  教材学习内容总结 ##  教材学习中的问题和解决过程 对于异常处理,程序中总有意想不到的状况所引发的的错误,Jav ...

  4. 下拉刷新和UITableView的section headerView冲突的原因分析与解决方案

    UITableView:下拉刷新和上拉加载更多 [转载请注明出处] 本文将说明具有多个section的UITableView在使用下拉刷新机制时会遇到的问题及其解决方案. 工程地址在帖子最下方,只需要 ...

  5. Let's Encrypt 免费通配 https 签名证书 安装方法2 ,安卓签名无法认证!

    Let's Encrypt 免费通配 https 签名证书 安装方法 按照上文 配置完毕后你会发现 在pc浏览器中正常访问,在手机浏览器中无法认证 你只需要安装一个或多个中级证书 1.查看Nginx ...

  6. NYOJ 133 子序列 (离散化)

    题目链接 描述 给定一个序列,请你求出该序列的一个连续的子序列,使原串中出现的所有元素皆在该子序列中出现过至少1次. 如2 8 8 8 1 1,所求子串就是2 8 8 8 1. 输入 第一行输入一个整 ...

  7. 【Git】git clone与git pull区别

    从字面意思也可以理解,都是往下拉代码,git clone是克隆,git pull 是拉.但是,也有区别: 从远程服务器克隆一个一模一样的版本库到本地,复制的是整个版本库,叫做clone.(clone是 ...

  8. 6 - Python内置结构 - 字典

    目录 1 字典介绍 2 字典的基本操作 2.1 字典的定义 2.2 字典元素的访问 2.3 字典的增删改 3 字典遍历 3.1 遍历字典的key 3.2 遍历字典的value 3.3 变量字典的键值对 ...

  9. Ubuntu10.04 下安装RabbitVCS

    安装RabbitVCS的方法步骤如下: 1.sudo add-apt-repository ppa:rabbitvcs/ppa       #将rabbitvcs的添加到源里面.(次操作会提示是否要添 ...

  10. BZOJ 3958 Mummy Madness

    Problem BZOJ Solution 算法:二分+扫描线 快要2019年了,就瞎写一篇博客来凑数,不然感觉太荒凉了-- 答案是可二分的,那么二分的依据是什么呢?不妨设当前二分的答案为\(mid\ ...