一、gsoap 常用函数说明 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中的协议包发送给服务器端,不会丢失协议内容,至于服务器端怎样处理,只有读代码了
管理内存函数 //分配指定大小的内存 //复制字符串 char * soap_strdup(struct soap *soap, const char *s) //复制宽字节字符串 char * soap_wstrdup(struct soap *soap, const wchar_t *s) 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结构
在序列化文件(*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,同时必须有一个参数
|
|