gsoap教程

来源:互联网 发布:acfun mac客户端下载 编辑:程序博客网 时间:2024/06/06 07:46

gSOAP官方地址:http://gsoap2.sourceforge.net/

首先下载最新版本gSOAP源码包,本文演示下载最新的gsoap_2.8.8.zip,然后解压到D:\gsoap-2.8,可以看到很多源码文件及编译配置文件。首先最好阅读根目录下readme.txt文件,gsoap目录下还有samples目录下有大量的例子可供编译参考。

一、创建服务器端源文件

依次进入D:\gsoap-2.8\gsoap\bin\win32,天缘测试操作系统为Windows7,所以进入win32目录,非windows平台进入linux386或macosx目录(实际生成结果都是一样的)。说明如下:

  • macosx        MAC OS X universal binaries
  • win32        Windows 386 compatible
  • linux386    Linux i386 compatible

1、创建头文件sum.h

在上面的win32目录下创建sum.h,内容如下:

//gsoap ns service name:sum//gsoap ns service style:rpc//gsoap ns service encoding:encoded//gsoap ns service namespace:http://localhost/sum.wsdl//gsoap ns service location:http://localhost/sum.cgi//gsoap ns schema namespace: urn:sumint ns__sum( int a, int b, int* res ); 

这里头那么多东西,都是按照规范来的,比如“ns”表示名空间namespace,“service name:sum”表示服务名为sum,......涉及很多内容,可以先不用管,等下文测试完成再回头慢慢学习,具体参数请参考官方的文档中有说明。

2、生成服务器端代码

打开CMD命令行,并进入D:\gsoap-2.8\gsoap\bin\win32目录,输入并执行:

soapcpp2 -S sum.h

详细命令请参考soapcpp2 -h,但要注意,如果你最终的调用程序是C++的最好生成C++代码,如果最终是C的也最好使用-c参数生成C代码,目前最新版本2.8.12如果交叉调用就遇到如下问题,编译通过运行只能连接但接收不到数据,而且存在读客户端的IP地址也有问题,统一代码后就没问题,下面的客户端也需要类似处理。当提示:Compilation successful.时说明执行成功。

可以在桌面上手动创建两个目录,GsServer和GsClient,这两个目录前者用来测试SOAP服务器端,后者用来测试SOAP客户端。

3、把生成文件全部分别剪切到GsServer目录下。

注意要排除soapcpp2.exe和wsdl2h.exe和sum.h三个文件,把其它生成文件都拷贝到GsServer目录,还有,要把D:\gsoap-2.8\gsoap目录下的stdsoap2.h和stdsoap2.cpp也拷贝到本目录(如果只使用C语言,就拷贝.C文件,这两个文件都是独立文件只根gsoap版本有关),然后在,GsServer目录下创建一个控制台工程,或者简单点,直接创建一个gserver.cpp文件,代码如下:

#include <stdio.h>#include <stdlib.h>#include "stdsoap2.h"#include "sum.h"#include "sum.nsmap"int ns__sum(struct soap *sum_soap, int a, int b, int *res){*res= a+ b;return 0;}int main(int argc, char* argv[]){int m, s;struct soap sum_soap;soap_init(&sum_soap);int sock_port = 8080;//listen port, sample!!!m = soap_bind(&sum_soap, NULL, sock_port, 100);if (m < 0) {soap_print_fault(&sum_soap, stderr);exit(-1);}fprintf(stderr, "Socket Connection(listen socket = %d)\n", m);for ( ; ; ) {s = soap_accept(&sum_soap);if (s < 0){soap_print_fault(&sum_soap, stderr);exit(-1);}fprintf(stderr, "Socket Connection(new socket = %d)\n", s);soap_serve(&sum_soap);soap_end(&sum_soap);}return 0;}

注意:

  • ns__sum函数定义方法,以及参数也增加了,sum_soap指针,这是GSOAP的约定
  • main函数体内的监听以及accept部分都是通用代码
  • soap初始化以及结束代码也是规则,可以参考gsoap的官方文档说明

4、编译soap服务器端

用VC等编译工具打开gserver.cpp,然后添加:

soapC.cpp、soapServer.cpp、stdsoap2.cpp三个文件(都在当前目录下)添加进入当前工程参与编译。编译完成得到gserver.exe。

5、运行gsoap服务器端

运行gserver即可看到监听窗口。

Socket Connection(listen socket = 124)

二、创建gsoap客户端

1、回到D:\gsoap-2.8\gsoap\bin\win32目录

仍然使用sum.h文件,内容跟上文相同。

2、生成gsoap客户端

执行CMD命令:

soapcpp2 -C sum.h

3、拷贝并编译gsoap客户端

把生成文件除了上面提到的三个文件,其余的全部分别剪切到GsCient目录。还有,把D:\gsoap-2.8\gsoap目录下的stdsoap2.h和stdsoap2.cpp也拷贝到本目录(如果只使用C语言,就拷贝.C文件)。同样方法创建一个gsclient.cpp文件,调用上文的gsoap接口,代码如下:

#include <stdio.h>#include <stdlib.h>#include "stdsoap2.h"#include "soapH.h"#include "sum.nsmap"int test_sum(const char* host, int a, int b, int *res) {struct soap sum_soap;int result = 0;soap_init(&sum_soap);soap_call_ns__sum( &sum_soap, host, "", a, b, res );if(sum_soap.error){printf("soap error:%d,%s,%s\n", sum_soap.error, *soap_faultcode(&sum_soap), *soap_faultstring(&sum_soap) );result = sum_soap.error;}soap_end(&sum_soap);soap_done(&sum_soap);return result;}int main(int argc, char **argv){char* host="http://localhost:8080";int result = -1;int a = 0;int b = 0;int sum = 0;a = 8;//Test input 8 b = 9;//Test input 9result = test_sum(host, a, b, &sum);if (result != 0) {printf("soap err,errcode = %d\n", result);}else {printf("%d+%d=%d\n", a, b, sum );}return 0;}

soapC.cpp、soapClient.cpp、stdsoap2.cpp三个文件也添加到当前工程参与编译。

注意:

  • soap_call_ns__sum调用方式是在ns_sum加了个头soap_call_
  • soap_call_ns__sum后面的参数也多了两个,一个是host URL,一个是action,具体意义可以参考官方说明。

4、运行测试gsoap客户端

输出:8+9=17

更多参考,请参考官方主页,以及源码目录下的readme和samples。

参考资料:

http://blog.csdn.net/fover717/article/details/4302653

http://blog.csdn.net/zozoiiiiiiii/article/details/7418339

Linux编译参考:

http://xzhoumin.blog.163.com/blog/static/4088113620116510461955/

更多文章:

如何在VC++中创建快捷方式

VC++通过进程注入读取其它程序列表数据演示

Linux C/C++多线程pthread实例

Linux下C/C++编程访问MYSQL

VC++下使用ADO访问Access数据库完整篇

0 0
原创粉丝点击