gSOAP学习笔记总结版

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Struct soap add_soap;

Soap_malloc(add_soap, len); // 申请空间,soap_end函数释放

>>gsoap传输中文。我使用utf-8编码格式来支持汉字的传输。

1. 设置gsoap为utf-8传输数据

soap_set_mode( &SmsWBS_soap, SOAP_C_UTFSTRING ); //设置编码

SmsWBS_soap.mode|=SOAP_C_UTFSTRING;

2. 使用下面得函数转换我们的传输内容,即将我们的数据转成UTF-8编码:

int conv_charset( const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen )

{

int convlen = olen;

iconv_t conv = iconv_open( dest, src );

if( conv == (iconv_t) -1 )

return -1;

memset( output, 0, olen );

if( iconv( conv, &input, &ilen, &output, &olen ) ){

iconv_close(conv);

return -1;

}

iconv_close(conv);

return convlen-olen;

}

例子:conv_charset( "UTF-8", "GBK", "林学任.linxr", strlen("林学

任.linxr"), buf_out->name, 100 );

>>gsoap中返回字符串

1. 下面是一个逆转字符串的函数。

int ns__echo_USCOREreverse( char * buf_in, char ** buf_out );

int ns__echo_USCOREreverse( struct soap *add_soap, char *buf_in, char **buf_out )

{

int i, j, len;

printf( "ns__interface: in=[%s]\n", buf_in );

len = strlen(buf_in);

*buf_out = (char*)soap_malloc( add_soap, len+1 );

for( i=len-1, j=0; i>=0; i--, j++ ){

(*buf_out)[j] = buf_in[i];

}

(*buf_out)[j] = 0;

return 0;

}

其中调用soap_malloc申请空间,并且将他赋给返回参数buf_out。这个空间会在调用soap_end时被释放。

>>接口定义,可参考《GSoap接口定义》。这里我将给出C#引用这个webserver所对应的接口形式。

gsoap是根据我们定义好的.h文件,然后用工具产生了我们所需的.c文件。所以我们必须根据gsoap的要求编写.h。

1. 单个参数的传出:

int ns__add( int a, int b, int *c );

需要说明的是,这里的ns__是必须的,必须以开始注释中的ns加两个下划线开始。返回值必须是int。

但是这里的int并不是接口的返回值,而是gsoap内部的返回值。真正的返回值是int *c。

C#中对应的接口: int add( int a, int b ); 返回值就是上述的int *c参数。

2. 多个参数传出,在接口中必须使用结构体

typedef char * xsd__string;

typedef long xsd__int;

struct ns__personResponse{

xsd__int age;

xsd__string name;

xsd__string address;

};

int ns__person( xsd__string buf_in, struct ns__personResponse * buf_out );

在C#中,并不是我们所声明的这样。而是:int person( string buf_in, out string name, out string address );

即,结构体中的第一个域会变成返回值,其他的变成一个个的输出参数。

3. 返回结构体。如果要返回结构图,那么必须在结构体中再套一层结构体:

typedef char * xsd__string;

typedef long xsd__int;

struct ns__person{

xsd__int age;

xsd__string name;

xsd__string address;

};

struct ns__personResponse{

xsd__int ret;

struct ns__person person;

};

int ns__person( xsd__string buf_in, struct ns__personResponse * buf_out ); 那么在C#中,看到的接口是这样的:int person( string buf_in, person对应的结构类);

4. 接口中的下划线,如果接口中的交易名有下划线,必须这么声明:

int ns__echo_USCOREreverse( char * buf_in, char ** buf_out );

那么,C#中实际上的接口名就是:string echo_reverse( string buf_in );

相关文档
最新文档