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目录(实际生成结果都是一样的)。说明如下:
在上面的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:sum int ns__sum( int a, int b, int* res );
这里头那么多东西,都是按照规范来的,比如“ns”表示名空间namespace,“service name:sum”表示服务名为sum,......涉及很多内容,可以先不用管,等下文测试完成再回头慢慢学习,具体参数请参考官方的文档中有说明。
打开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客户端。
注意要排除soapcpp2.exe和wsdl2h.exe和sum.h三个文件,把其它生成文件都拷贝到GsServer目录,还有,要把D:\gsoap-2.8\gsoap目录下的stdsoap2.h和stdsoap2.cpp也拷贝到本目录(如果只使用C语言,就拷贝.C文件,这两个文件都是独立文件只根gsoap版本有关),然后在,GsServer目录下创建一个控制台工程,或者简单点,直接创建一个gserver.cpp文件,代码如下:
#include#include #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; }
注意:
用VC等编译工具打开gserver.cpp,然后添加:
soapC.cpp、soapServer.cpp、stdsoap2.cpp三个文件(都在当前目录下)添加进入当前工程参与编译。编译完成得到gserver.exe。
运行gserver即可看到监听窗口。
Socket Connection(listen socket = 124)
仍然使用sum.h文件,内容跟上文相同。
执行CMD命令:
soapcpp2 -C sum.h
把生成文件除了上面提到的三个文件,其余的全部分别剪切到GsCient目录。还有,把D:\gsoap-2.8\gsoap目录下的stdsoap2.h和stdsoap2.cpp也拷贝到本目录(如果只使用C语言,就拷贝.C文件)。同样方法创建一个gsclient.cpp文件,调用上文的gsoap接口,代码如下:
#include#include #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 9 result = 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三个文件也添加到当前工程参与编译。
注意:
输出: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数据库完整篇