当前位置: 首页 > 工具软件 > gSOAP > 使用案例 >

使用gsoap介绍

戴建义
2023-12-01


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

soap_connect()函数中把原来的soap->mode进行了修改,这样在下次调用,同时对填入soap->buf的字符进行计数。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__(*)将程序中request 已序列化的参数放到xml里body位置

    -soap_body_end_out中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_begin_recv(soap)             //阻塞在这里 收到消息后 调用http_parse解析http头部
   soap_envelope_begin_in(soap)      /*从buf中找寻envelope开始标签(begin),in代表是从buf中解析结构  out代表把结构填充到buf中去。可以在这里做分流,
                                             有<envelope>认为是onvif部分继续交gsoap处理,没有的交http服务器处理。*/
   soap_recv_header(soap)            //从buf中分离出header域。
   soap_body_begin_in(soap))         //找寻body的开始标签

管理内存函数

//分配指定大小的内存
void * soap_malloc(struct soap *soap, size_t n)

//复制字符串

char * soap_strdup(struct soap *soap, const char *s)

//复制宽字节字符串

char * soap_wstrdup(struct soap *soap, const wchar_t *s)
//动态创建c++对象
class * soap_new_class(struct soap *soap)   //这里的class是代表创建的类名

soap_destroy(struct soap *soap)//释放所有动态分配的C++类,必须在soap_end()之前调用。(class* soap_new_class (soap*) 此函数创建的c++对象)

soap_end(struct soap *soap)//释放所有存储临时数据和反序列化数据中除类之外的空间(soap_malloc的数据也属于反序列化数据)。

soap_done(struct soap *soap)//Detach soap结构(即初始化化soap结构)

soap_free(struct soap *soap)//Detach 且释放soap结构


//复制一个soap结构体
soap* soap_copy(soap*) //该函数调用soap_copy_context(soap* copy,soap* soap)//复制出的新的soap有自己的上下文管理及自己的临时数据和反序列化数据的管理及自己的c++类对象;也就是说复制出的新的soap不包含原来soap的上下文的对象(c++类对象和反序列化内存),其他都是一样的。
 

在序列化文件(*C.cpp *H.h)里有 soap_default_和soap_serialize_分别意思为设置默认值和序列化某个对象

二、gsoap常见问题

    1.当在一个工程中用gsoap建立多个webservice时,由gsoap产生的文件(*C.cpp)编译时就会冲突,编译失败。

    解决办法:先创建一个空的.h文件如:env.h,然后执行soapcpp2 -p env env.h 生成envC.cpp和envH.h文件;接着编译生成stdcpp2.o时使用g++ -c -DWITH_NONAMESPACES stdsoap2.cpp。这样在stdcpp2.o里就没有共有的序列化和反序列化的实现,这些共有的实现就放在了envC.cpp里

三、.h文件规则

    注意:函数名由namespace+__+name组成;返回值为int.

    参数规则:最后一个参数为输出参数,前面均为输入参数。最后一个参数为指针或引用类型。如果只有一个参数那么只能是输出参数。

    如果要定义没有输入参数的函数可以如下:int ns__add(void*_,bool*res);这表示没有输入和只有一个bool类型的输出参数。或者可以不写输入参数,int ns__add(boo* res);

    如果定义没有输出参数可以如下:int ns__add(int a,int c,void);//表示没有输出参数

    如果定义没有输入和输出参数就可写成:int ns__add(void);

    gsoap会忽略输入参数的void*和输出参数void,且最后一个参数为void,同时必须有一个参数

            

 类似资料: