Gsoap搭建WebService服务的一个简单实现(windows)

gsoap使用方法

步骤1首先下载gsoap的工具。这里下载了gsoap_2.7.10.解压之后,在里面会发现两个exe可执行文件。soapcpp2.exewsdl2h.exe。另外还有两个比较重要的源文件:stdsoap2.hstdsoap2.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.hsoapStub.hsoapH.hadd.nsmap。但是因为soapStub.h包含了stdsoap2.hsoapH.h包含了soapStub.h,所以工程中只需要包含soapH.hcalculate.nsmap。对于源文件,若是服务器端,需要stdsoap2.cppsoapC.cppsoapServer.cpp;客户端则需要stdsoap2.cppsoapC.cppsoapClient.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 如能看到如下信息,说明服务器运行正常。


步骤6.在客户端建立testgsoap工程,同样添加7个相关文件,进行预编译设置,link添加,然后建立addClient.cpp主文件。

然后编译,同样在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。


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值