gsoap使用方法
步骤1:首先下载gsoap的工具。这里下载了gsoap_2.7.10.解压之后,在里面会发现两个exe可执行文件。soapcpp2.exe和wsdl2h.exe。另外还有两个比较重要的源文件:stdsoap2.h和stdsoap2.cpp。
步骤2:将gSoap解压出来后,将\gsoap-win32-2.7的soapcpp2.exe放到testgsoap里面
用vc在testgsoap建立一个add.h的头文件。新建一个.h文件用来声明所要暴露给外界的接口。注意虽然是add.h头文件,但是千万不能有注释。内容如下:
//gsoap ns service name: add
//gsoap ns service namespace: http://localhost/add.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add
int ns__add( int num1, int num2, int* sum );
步骤3:使用soapcpp2.exe工具来生成相关的源文件。使用方法是soapcpp2 add.h
这里没有带选项,那么生成的是最全的源文件,包括客户端的和服务器的以及其它一些文件。当然也可以使用选项来生成需要的文件,可以再命令行下面使用soapcpp2 –help来参看选项。
步骤4:建立服务器端的工程testgsoap。新建工程后编写服务器端主函数addServer.cpp,内容如下:
#include <stdio.h>
#include <stdlib.h>
#include "stdsoap2.h"
#include "add.h"
#include "add.nsmap"
int main(int argc, char* argv[])
{
int m, s;
struct soap add_soap;
soap_init(&add_soap);
//soap_set_namespaces(&add_soap, add_namespaces);
if (argc < 2)
{
printf("usage: %s <server_port> \n", argv[0]);
exit(1);
}
else
{
m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
if (m < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
for ( ; ; )
{
s = soap_accept(&add_soap);
if (s < 0)
{
soap_print_fault(&add_soap, stderr);
exit(-1);
}
fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
soap_serve(&add_soap);//该句说明该server的服务
soap_end(&add_soap);
}
}
return 0;
}
//server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 + num2;
return 0;
}
注意:1.工程中需要的头文件有stdsoap2.h、soapStub.h、soapH.h、add.nsmap。但是因为soapStub.h包含了stdsoap2.h;soapH.h包含了soapStub.h,所以工程中只需要包含soapH.h、calculate.nsmap。对于源文件,若是服务器端,需要stdsoap2.cpp、soapC.cpp和soapServer.cpp;客户端则需要stdsoap2.cpp、soapC.cpp和soapClient.cpp;
添加其他文件有7个add.h、soapH.h、soapStub.h、stdsoap2.h、soapC.cpp、soapServer.cpp、stdsoap2.cpp(一个一个的添加,免得出错),在project-setting中将添加进来的3个cpp源文件的C/C++选项的Category设置为Precompiled Headers。
2.在project-setting-link添加“wsock32.lib”库,gsoap需要用到sock套接字通信。
步骤5.编译,编译成功后,会在你的工程目录/Debug目录下生成addServer.exe。在命令行输入addServer.exe 4567(任意端口号)运行服务器端程序。
从IE浏览器访问http://localhost:44567 如能看到如下信息,说明服务器运行正常。
然后编译,同样在debug目录下生成testgsoap.exe。
在命令行输入testgsoap.exe 1 2 能看到结果:1+2=3
在浏览器输入http://服务器ip:4567也能看到xml信息。
注意:服务器端编译的时候可能会出现错误:stdsoap2.h error C2079: 'storage' uses undefined struct 'sockaddr_storage'。这个问题是因为gsoap版本过高,可能支持的ipv6的地址。当使用最新版gsoap2.8.27时会出现这个问题,换成gsoap-2.8.11编译就没有问题了。故本文使用的版本为gsoap-2.8.11。