www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

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

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

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

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

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

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

????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;
????}
??}
}

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

?

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

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

{??

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

????????

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

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

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

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

?????

}

?

?7)soap_putheader(){}->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動態(tài)分配的空間在soap機構中struct?soap_plist?*pht[SOAP_PTRHASH];鏈表中的id值

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

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

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

?????????}

?????????

}

?

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

}

?9)soap_default__<*>(<*>代表相應的功能函數(shù)標識,?例如soap_default__tds__GetNetworkInterfacesResponse)(){}//僅僅是對恢復結構進行初始化

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

11)soap_begin_recv(){

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

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

??????????????????????????????????????????????*也?沒有關??系,因為在后面的

??????????????????????????????????????????????*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)計數(shù)字,同時soap->count統(tǒng)計總的接收到的字符數(shù).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))//Ⅰ)?Ⅱ)??Ⅲ)?這三句代碼目的:找到第一次接收到的數(shù)據(jù)信息中從soap->buf[0]開始的第一個不是0x00-0x20之間asii碼之間的字符
???????Ⅲ)???c?=?soap_getchar(soap);

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

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

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

?????

}

12)soap_envelope_begin_in(){//對指定的協(xié)議標識字符串進行解析,?例如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協(xié)議的第一個"<"

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

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