當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀]onvif_gsoap開發(fā)中的一些疑慮 原文鏈接:http://hi.baidu.com/gpf626487/item/77e50c57fc5e2b3e32e0a9ce ????①(********

onvif_gsoap開發(fā)中的一些疑慮

原文鏈接:http://hi.baidu.com/gpf626487/item/77e50c57fc5e2b3e32e0a9ce

????①(*********)soap結(jié)構(gòu)中count(soap->count)成員記錄的是http協(xié)議中Content-Length的數(shù)值;

????②keep_alive既是在通訊過程中的正常鏈接的一個(gè)狀態(tài)標(biāo)示也是關(guān)系到http協(xié)議中Connection:keep-alive的填寫open還是close.

????1)????gsoap中生成的*.c文件中在生成xml協(xié)議信息時(shí),是通過soap->fposthdr,soap_puthttphdr生成一些http協(xié)議部分.

????2)在gsoap通訊過程中,通過soap->fpost(),生成發(fā)送協(xié)議中的http協(xié)議部分.

函數(shù)soap_set_local_namespaces(struct?soap?*soap)

????3)soap_connect()函數(shù)中把原來的soap->mode進(jìn)行了修改,這樣在下次調(diào)用,同時(shí)對(duì)填入soap->buf的字符進(jìn)行計(jì)數(shù),在函數(shù)soap_connect()中soap->bufidx統(tǒng)計(jì)的是http協(xié)議部分的字符數(shù);在soap_envelope_begin_out()統(tǒng)計(jì)envelope部分的計(jì)數(shù),同時(shí)填寫xml中envelope部分;soap_putheader()統(tǒng)計(jì)putheader部分的計(jì)數(shù),同時(shí)填寫xml中putheader部分;soap_body_begin_out()統(tǒng)計(jì)body部分的計(jì)數(shù),同時(shí)填寫xml中body部分;soap_put___tds__(*)(*標(biāo)示相關(guān)功能標(biāo)識(shí),例如GetNetworkInterfaces)統(tǒng)計(jì)__(*)(*標(biāo)示相關(guān)功能標(biāo)識(shí),例如GetNetworkInterfaces)部分的計(jì)數(shù),同時(shí)填寫xml中__(*)(*標(biāo)示相關(guān)功能標(biāo)識(shí),例如GetNetworkInterfaces)部分;soap_body_end_outconnect()中soap->bufidx統(tǒng)計(jì)的是body部分結(jié)束標(biāo)簽的字符數(shù)同時(shí)把結(jié)束標(biāo)簽寫入xml;soap_envelope_end_out()同前;soap_end_send()->soap_flush()->soap_flush_raw()->soap->fsend(),在函數(shù)soap_end_send()中進(jìn)行sock發(fā)送,在此函數(shù)中第一次使用soap結(jié)構(gòu)(接受/發(fā)送結(jié)束),對(duì)soap->budidx,soap->count進(jìn)行清零.在?次之前結(jié)構(gòu)中soap->buflen一次未用到,猜測(cè)次成員只在解析時(shí)使用.在這些處理過程中,如果(soap->bufidx?>?SOAP_BUFLEN),那么,由于soap_connect()已經(jīng)建立了socket通訊,所以只要條件滿足就用soap->flush()把buf中的協(xié)議包發(fā)送給服務(wù)器端,不會(huì)丟失協(xié)議內(nèi)容,至于服務(wù)器端怎樣處理,只有讀代碼了.

????4)soap_element()

??{?if?(soap->namespaces?&&?!soap->local_namespaces)
??{?register?const?struct?Namespace?*ns1;
????register?struct?Namespace?*ns2;
????register?size_t?n?=?1;
???for?(ns1?=?soap->namespaces;?ns1->id;?ns1++)
??????n++;
????n?*=?sizeof(struct?Namespace);
????ns2?=?(struct?Namespace*)SOAP_MALLOC(soap,?n);
????if?(ns2)
????{?memcpy(ns2,?soap->namespaces,?n);
??????if?(ns2[0].ns)
??????{?if?(!strcmp(ns2[0].ns,?soap_env1))
??????????soap->version?=?1;
????????else
??????????soap->version?=?2;
??????}
??????soap->local_namespaces?=?ns2;
????}
??}
}

黑體字標(biāo)示的地方,作用是吧ns2為首地址的各個(gè)成員指針指向在*.nsmap中的SOAP_NMAC?struct?Namespace?namespaces[]{...}定義成員.

?

???5)soap_attribute(){}函數(shù)是填寫/處理xml協(xié)議中的"

???6)soap_element_begin_out函數(shù)//填寫/處理一個(gè)標(biāo)簽的開始部分,包括它的屬性信息,例如“xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope"”

{??

?????????????.............

????????

??????????????????????????soap_element()函數(shù)填寫/處理一個(gè)xml節(jié)點(diǎn)標(biāo)簽的從“<”開始到">"之前的所有信息,

????????????????????????????..............

??????????????????????????soap_element_start_end_out()函數(shù)填寫/處理同一xml節(jié)點(diǎn)標(biāo)簽的">".

??????????????????????????.................

?????

}

?

?7)soap_putheader(){}->soap_out_SOAP_ENV__Header(){//用于處理(填寫)xml中的soapheader部分標(biāo)簽

????????????if?(soap_element_begin_out()){//填寫/處理header的開始標(biāo)簽

?????????????????????

???????????}

??????????if?(soap_out__wsa__MessageID()){

???????????????//soap_out__wsa__MessageID()==soap_out_string(){

????????????????//soap_outstring(){

???????????????????????//???????id?=?soap_element_id()//該id值可以是soap->malloc動(dòng)態(tài)分配的空間在soap機(jī)構(gòu)中struct?soap_plist?*pht[SOAP_PTRHASH];鏈表中的id值

????????????????????????//

???????????????????????}

???????????????//}

?????????}

?????????

}

?

?8)SOAP_FMAC5?int?SOAP_FMAC6?soap_call___tds__(*)(例如GetNetworkInterfaces){

}

?9)soap_default__<*>(<*>代表相應(yīng)的功能函數(shù)標(biāo)識(shí),?例如soap_default__tds__GetNetworkInterfacesResponse)(){}//僅僅是對(duì)恢復(fù)結(jié)構(gòu)進(jìn)行初始化

?10)soap_begin_count()函數(shù)在再次soap結(jié)構(gòu)中一些在該請(qǐng)求中要用到和可能用到的量進(jìn)行清零/初始化,最主要是的設(shè)置xml結(jié)構(gòu)的mode信息默認(rèn)情況下是soap->mode=0x20008;

11)soap_begin_recv(){

?????????.......//前面在進(jìn)行一些在接收/解析過程中的用到的一些數(shù)據(jù)的初始化/清理

???????Ⅰ)?c?=?soap_getchar(soap);/*第一次進(jìn)行接收數(shù)據(jù),然而即使這次數(shù)據(jù)量為零,

??????????????????????????????????????????????*也?沒有關(guān)??系,因?yàn)樵诤竺娴?/p>

??????????????????????????????????????????????*soap_envelope_begin_in()等函數(shù)中可以再次接收,

?????????????????????????????????????????????*也就是說第一次接收到數(shù)據(jù)量為0或者沒有接收完完整

????????????????????????????????????????????*的協(xié)議內(nèi)容也可以在后面的soap_envelope_begin_in()

????????????????????????????????????????????*等這些函數(shù)中繼續(xù)接收,只要soap->socket不釋放掉

????????????????????????????????????????????*就可以.其中soap->buflen中記錄了一次接收到的數(shù)據(jù)的

???????????????????????????????????????????*字符統(tǒng)計(jì)數(shù)字,同時(shí)soap->count統(tǒng)計(jì)總的接收到的字符數(shù).soap->bufidx?=?0;soap->buflen?=?ret?=?soap->frecv()在每次socket接收前對(duì)soap->budidx進(jìn)行清零;每次在soap_getchar(struct?soap?*soap){.......

???????????????return?soap_get1(soap);}之前對(duì)soap->ahead進(jìn)行清零/處理;整理得知:soap_getchar()->soap_get1()->soap_recv()/return?(unsigned?char)soap->buf[soap->bufidx++];->soap_recv_raw(soap)->soap->frecv()*/

?????????????????????????????????????????????

???????......//這里是些宏選擇代碼

?????Ⅱ)?while?(soap_blank(c))//Ⅰ)?Ⅱ)??Ⅲ)?這三句代碼目的:找到第一次接收到的數(shù)據(jù)信息中從soap->buf[0]開始的第一個(gè)不是0x00-0x20之間asii碼之間的字符
???????Ⅲ)???c?=?soap_getchar(soap);

???????.....//通過一系列的if()判斷后從接收到的buf中找打第一個(gè)符合協(xié)議的要求的字符,這個(gè)字符存儲(chǔ)在c變量中.

?????然后把這個(gè)符合協(xié)議要求起始字符存儲(chǔ)在soap->ahead中(存儲(chǔ)的是ASII碼).

??????soap->error?=?soap->fparse(soap);//解析出http協(xié)議部分.

?????

}

12)soap_envelope_begin_in(){//對(duì)指定的協(xié)議標(biāo)識(shí)字符串進(jìn)行解析,?例如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中找到相應(yīng)的匹配字符串.例如SOAP-ENV:Envelope,存儲(chǔ)在soap->tag中

??????????????????????..............

??????????????????????soap_unget(soap,?c);//獲取到第一個(gè)xml協(xié)議的第一個(gè)"<"

??????????????????????................

??????????????????????while?(soap_blank(c))
????????????????????????????c?=?soap_get(soap););//把xml協(xié)議的頭部信息過濾掉.即:

?????????????????????....................

??????????????????????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?=?'