20160421 VC++6.0环境下gSOAP的使用

来源:互联网 发布:南京高新盘城网络问政 编辑:程序博客网 时间:2024/04/29 03:42

一、gSOAP简介

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。


二、gSOAP下载地址

http://www.genivia.com/products.html

下载下来解压以后文件夹如下:

其中gsoap中的两个文件:

以及如下路径两个文件复制出来放到一个文件夹下,稍后有用:


拷出来以后总共是如下四个文件:


三、实现简单加法实例

基本功能:实现一个简单的a+b程序,在服务器端写一个程序,里面包含了a+b的函数,
然后通过客户端代码向其发送两个数字,在服务器运算得到结果返回给客户端显示出来。

1、新建一个文件夹server;
2、将gSoap解压出来后的四个文件放到server里面;
3、在server文件夹下建立一个add.h的头文件,代码如下:

<span style="font-size:18px;">//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:addint ns__add(int num1, int num2, int* sum);</span>

函数返回值必须是int,然后跟"ns__"(两个下划线),最后一个参数必须是引用类型或者指针类型(需要将值传出来)。

4、运行cmd跳到server文件夹,输入命令soapcpp2.exe add.h后,该文件夹显示如下(拷贝一份出来用于后面client):


5、用VC6.0新建一个Win32控制台应用程序(Empty),名字为server(我前面的server文件夹得路径为D:/add/server,那么这个时候创建的工程路径为D:/add/,名字为server),在工程下面新建一个addserver.cpp的源文件,源文件中的代码如下:

<span style="font-size:18px;">#include <stdio.h>#include <stdlib.h>#include "stdsoap2.h"#include "add.h"#include "add.nsmap"#include "windows.h"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;}</span>

6、添加其他文件有7个add.h、soapH.h、soapStub.h、stdsoap2.h、soapC.cpp、soapServer.cpp、stdsoap2.cpp,

在project-setting中将添加进来的3个源文件的C/C++选项的Category设置为Precompiled Headers(只要改一个其他都改了):

7、在project-setting-Link在Object/library modules后添加一个wsock32.lib:


8、编译,如果这个时候有编译错误,估计是文件添加和add.h生成代码这两步有错误,如果是“sockaddr_storage未定义”,那么可以自己在上面添加如下代码(添加在宏下面):

<span style="font-size:18px;">struct sockaddr_storage { u_char sa_len; u_char sa_family; u_char padding[128]; };</span>

到此应该没有大的错误了,如果还有,那么可以定位到那句话,将它注释掉(一般可以这么做)。
 如果编译成功后,在Debug文件夹里面会有一个server.exe的文件,
打开cmd,转到Debug文件下,输入server.exe 4567,接着在IE中输入
http://localhost:4567

,如果显示xml页面,说明程序已经启动。


9、客户端代码编写,步骤与server类似,新建一个client文件夹,上面第4步为止的所有文件拷贝到client文件夹中,接着建立一个Win32控制台应用程序,名字为client(我前面的client文件夹的路径为D:/add/client那么这个时候创建的工程路径为D:/add/,名字为client),在工程下面新建一个addclient.cpp的源文件,源文件中的代码如下:

#include <stdio.h>#include <stdlib.h>#include "stdsoap2.h"#include "soapH.h"#include "add.nsmap"int add(const char* server, int num1, int num2, int *sum); int main(int argc, char **argv){int result = -1; char* server="http://localhost:4567";int num1 = 0;int num2 = 0;int sum = 0;if( argc < 3 ){printf("usage: %s num1 num2 \n", argv[0]);exit(0);}num1 = atoi(argv[1]);num2 = atoi(argv[2]);result = add(server, num1, num2, &sum);if (result != 0){printf("soap err,errcode = %d\n", result);}else{printf("%d+%d=%d\n", num1, num2, sum );}return 0;}int add(const char* server, int num1, int num2, int *sum){struct soap add_soap;int result = 0;soap_init(&add_soap);// soap_set_namespaces(&add_soap, add_namespaces);//该函数是客户端调用的主要函数,后面几个参数和add.h中声明的一样,前面多了3个参数,函数名是接口函数名ns__add前面加上//soap_call_ soap_call_ns__add( &add_soap, server, "", num1, num2, sum );if(add_soap.error){printf("soap error:%d,%s,%s\n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap) );result = add_soap.error;}soap_end(&add_soap);soap_done(&add_soap);return result;}

10、添加其他文件有7个add.h、soapH.h、soapStub.h、stdsoap2.h、soapC.cpp、soapClinet.cpp、stdsoap2.cpp,在project-setting中将添加进来的3个源文件的C/C++选项的Category设置为Precompiled Headers(和server不同的是一个添加soapServer.cpp文件而另一个是添加soapClient.cpp文件);
11、在project-setting-Link在Object/library modules后添加一个wsock32.lib,之后编译,编译成功后在Debug文件夹下会有一个
client.exe文件;
12、运行一个cmd跳到server/Debug下输入 server.exe 4567
13、运行另一个cmd跳到client/Debug下输入 client.exe 1 2
这个时候就会出现了1+2=3
14、如果server.exe与client.exe两个文件在两台不同的电脑上,那么将client.exe的代码char* server="
http://localhost:4567";那行将localhost改为服务器的ip地址再重新编译即可(addclient.cpp中)。





0 0
原创粉丝点击