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 
#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;
}

注意:

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

注意:

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

你可能感兴趣的:(工具使用)