gsoap教程

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:sum

int 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 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三个文件也添加到当前工程参与编译。

注意:

  • 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数据库完整篇

带gsoap-2.8源码,基于服务器客户端的实例,带自动生成服务客户端代码的批处理程序,及如何使用。带自己学习参考的教程; 0.解压附件,soapInterface.bat所在路径不得含中文 空格 1.新建头文件 取soapInterface.bat文件的同名:soapInterface.h 文件内编写接口,具体说明看附件参考的教程 //gsoap ns service name: gservice //gsoap ns service style: rpc int ns__add(int num1, int num2, int* result ); int ns__sub(int num1, int num2, int* result ); int ns__mult( int num1, int num2, int *result); int ns__divid( int num1, int num2, int *result); 2.从附件内gsoap-2.8包中搜索复制stdsoap2.h,stdsoap2.cpp,soapcpp2.exe, 存放于soapInterface.bat同级目录 3.双击soapInterface.bat运行。生成gClientSoap,gServerSoap两个文件夹,分别复制到服务器工程与客户端工程中使用 4.gClientSoap,gServerSoap两个文件夹内用到的文件功能说明,更多参考附件教程 1)soapC.cpp , soapH.h//soap的序列和反序列代码,它已经包含了soapStub.h 2)soapServer.c ppsoapServerLib.cpp //服务器端代码(纯C代码是soapServer.c soapServerLib.c ),soapServerLib.cpp文件则只是简单地包含soapServer.cpp和soapC.cpp 3)soapClient.cpp soapClientLib.cpp//客户端代码(纯C代码是soapClient.csoapClientLib.c ),soapClientLib.cpp文件则只是简单地包含soapClient.cpp和soapC.cpp 4) soapStub.h // soap的存根文件,定义了我们编写的头文件里对应的远程调用模型 5) add.nsmap //XML服务命名空间 6)服务器端要载入的文件有:soapServer.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h; 客户端要输入的文件有: soapClient.cpp,soapC.cpp,stdsoap2.cpp; 要包含的文件有:gservice.nsmap,soapH.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值