gsoap开发webservice
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。
gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。
gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它
来为你的web服务生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。
下面是gSOAP的一些特点:
gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。
如果用生成纯C的代码,需要加编译选项-c
wsdl2h -c -o outfile.h(为自己任意起的头文件) infile.wsdl(提供的wsdl文件)
如果用生成纯C的代码,需要加编译选项-c
soapcpp2 -c outfile.h生成构架代码
soapC.cpp soapC.h soapServer.cpp soapStub.h stdsoap2.cpp stdsoap2.h stlvector.h WcmpServiceSOAP11Binding.nsmap(这个文件名根据outfile文件是不同的)
作为客户端,需要的代码为:
soapC.cpp soapC.h soapClient.cpp soapStub.h stdsoap2.cpp stdsoap2.h stlvector.h WcmpServiceSOAP11Binding.nsmap(这个文件名根据outfile文件是不同的)

| #include "stdafx.h"#include "soapH.h"#include <stdio.h>#include "calc.nsmap"usingnamespacestd;intmain(intargc, char**argv){ SOAP_SOCKET m, s; /* master and slave sockets */  structsoap soap;  soap_init(&soap);  if(argc < 2)    soap_serve(&soap);  /* serve as CGI application */  else  { m = soap_bind(&soap, NULL, atoi(argv[1]), 100);    if(!soap_valid_socket(m))    { soap_print_fault(&soap, stderr);      exit(-1);    }    fprintf(stderr, "Socket connection successful: master socket = %d\n", m);    for( ; ; )    { s = soap_accept(&soap);      fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);      if(!soap_valid_socket(s))      { soap_print_fault(&soap, stderr);        exit(-1);      }       soap_serve(&soap);      soap_end(&soap);    }  }  return0;} int__cdecl ns2__add(structsoap *soap,doublea,doubleb,double&result){    result = a + b;    cout<<"the result is ---"<<result<<endl;    returnSOAP_OK;}int__cdecl ns2__sub(structsoap *soap, doublea, doubleb, double&result){    result = a - b;    returnSOAP_OK;}int__cdecl ns2__mul(structsoap *soap, doublea, doubleb, double&result){    result = a * b;    returnSOAP_OK;}int__cdecl ns2__div(structsoap *soap, doublea, doubleb, double&result){    if(b)    result = a / b;  else  { char*s = (char*)soap_malloc(soap, 1024);    sprintf(s, "<error xmlns=\"http://tempuri.org/\">Can't divide %f by %f</error>", a, b);    returnsoap_sender_fault(soap, "Division by zero", s);  }  returnSOAP_OK;}int__cdecl ns2__pow(structsoap *soap, doublea, doubleb, double&result){    result = pow(a, b);  if(soap_errno == EDOM)   /* soap_errno is like errno, but compatible with Win32 */  { char*s = (char*)soap_malloc(soap, 1024);    sprintf(s, "Can't take the power of %f to %f", a, b);    sprintf(s, "<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>", a, b);    returnsoap_sender_fault(soap, "Power function domain error", s);  }  returnSOAP_OK;} | 
| #include "stdafx.h"#include "soapH.h"#include "calc.nsmap"//const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi";constcharserver[] = "http://localhost:8000";intmain(intargc, char* argv[]){    structsoap soap;    doublea, b, result;      if(argc < 4)      { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");        exit(0);      }    soap_init1(&soap, SOAP_XML_INDENT);  a = strtod(argv[2], NULL);  b = strtod(argv[3], NULL);  switch(*argv[1])  { case'a':      soap_call_ns2__add(&soap, server, "", a, b, result);      break;    case's':      soap_call_ns2__sub(&soap, server, "", a, b, result);      break;    case'm':      soap_call_ns2__mul(&soap, server, "", a, b, result);      break;    case'd':      soap_call_ns2__div(&soap, server, "", a, b, result);      break;    case'p':      soap_call_ns2__pow(&soap, server, "", a, b, result);      break;    default:      fprintf(stderr, "Unknown command\n");      exit(0);  }  if(soap.error)  { soap_print_fault(&soap, stderr);    exit(1);  }  else    printf("result = %g\n", result);  soap_destroy(&soap);  soap_end(&soap);  soap_done(&soap);    return0;} | 


gsoap开发webservice的更多相关文章
- 使用GSoap开发WebService客户端与服务端
		Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现, 从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多. 用gsoap开发web service的大致思路 我 ... 
- windows下vs2012用gsoap开发webservice实例
		零:说明 1.本文是根据网上前人经验结合自己动手操作写成,开发工具用的vs2012,gsoap用的是gsoap-2.8: 2.gsoap提供的工具简单介绍 1)wsdl2h.exe:根据WSDL文件生 ... 
- VS2010使用c++、gSOAP创建WebService 图文教程
		VS2010使用c++.gSOAP创建的WebService 图文教程 环境 操作系统:Windows 7gsoap版本:2.8.32C++编译器/开发环境:Visual Studio 2010 gS ... 
- 使用JDK开发WebService
		一.WebService的开发手段 使用Java开发WebService时可以使用以下两种开发手段 1. 使用JDK开发(1.6及以上版本) 2.使用CXF框架开发(工作中) 二.使用JDK开发Web ... 
- Java开发Webservice的组件
		参考:http://bbs.csdn.net/topics/390900831 转自:http://blog.csdn.net/dragoo1/article/details/50759222 htt ... 
- 2.使用JDK开发webService
		使用jdk开发webService需要注意:jdk版本必须1.6以及1.6以上! 以下webService的组成部分: server端和client端,通过服务器端(server)webService ... 
- 利用NuSoap开发WebService(PHP)
		利用NuSoap开发WebService(PHP) 分类: php 2010-09-08 12:00 5005人阅读 评论(1) 收藏 举报 webservicephpsoapstringencodi ... 
- JAVA6开发WebService (四)——SAAJ调用WebService
		转载自http://wuhongyu.iteye.com/blog/810571 前面写了个JAX-WS的小例子,看到用JAVA6开发WebService确实很简单,也很方便,不过前面也说了,JAVA ... 
- Apache axis2 + Eclipse 开发 WebService
		yd小结注意:1.axis2的2个插件的版本必须与引入的jar包匹配,如果不同则可能报以下错误 “没有实现序列化方法”或 “org.apache.axis2.databinding.utils.wri ... 
随机推荐
- SASS入门之SASS安装
			当然...凭借我这样的肤浅的智商,根本不能理解什么叫certificate verfiy fail... 所以找了一段时间的方法,最后最终在一个sass群里找到了... 发在这里纯属作为自己的一个学习 ... 
- linux遍历目录源代码
			<pre code_snippet_id="1622396" snippet_file_name="blog_20160324_1_744516" nam ... 
- Android相关工具下载(ADT、NDK等等)
			一个非常牛掰的网站,可以下载很多Android相关的工具等 网址为: http://www.androiddevtools.cn/ 
- CentOS minimal 安装ssh 服务 和客户端
			检查是否装了SSH包 如果现实有openssh-server 说明系统已经安装了ssh 2 如果系统没有安装ssh 那么可以在线安装 yum install openssh-server 3 设置 ... 
- UITableView 自带编辑删除 自己定义button
			一:UITableView 自带编辑删除 1:实现两个方法就可以 #pragma mark tableView自带的编辑功能 -(void)tableView:(UITableView *)tab ... 
- # kubernetes调度之nodeName与NodeSelector
			系列目录 Kubernetes的调度有简单,有复杂,指定NodeName和使用NodeSelector调度是最简单的,可以将Pod调度到期望的节点上. 本文主要介绍kubernetes调度框架中的No ... 
- kubernetes资源调度之LimitRange
			系列目录 LimitRange从字面意义上来看就是对范围进行限制,实际上是对cpu和内存资源使用范围的限制 前面我们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从整体上来限制的,而Lim ... 
- Vuex demo
			<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ... 
- 基于TCP的通信程序设计
			套接字(Socket)是一种跨主机进程之间的双向通信接口,每个打开的套接字都可以通过一个套接字描述符来描述,因此可以使用低级文件编程库操作套接字. TCP是一中面向连接的网络传输控制协议.它每发送一个 ... 
- 九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
			时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1497 解决:406 题目描述: 有一个6*6的棋盘,每个棋盘上都有一个数值,现在又一个起始位置和终止位置,请找出一个从起始位置到终止位置代 ... 
