用gSOAP实现一个简单四则运算的服务器及代理。

Table of Contents

头文件

编写头文件calc.h

生成头文件calc.h

wsdl2h使用方法

生成服务端和客户端(代理)程序

soapcpp2使用方法

完整的makefile

客户端&服务端代码

服务端代码calcServer.cc

客户端代码calcClient.cc

运行

整体流程


试着用gSOAP实现一个简单四则运算的服务器代码,给出

头文件

编写头文件calc.h

//gsoap ns service name: calc Simple calculator service
//gsoap ns service style: rpc //gsoap ns service encoding: encoded
//gsoap ns service namespace: http://localhost/calc.wsdl
//gsoap ns service location: http://localhost/server.cgi
//gsoap ns schema namespace: urn:calc //gsoap ns service method: add Sums two values
int ns__add(double a, double b, double *result);//gsoap ns service method: sub Subtracts two values
int ns__sub(double a, double b, double *result);//gsoap ns service method: mul Multiplies two values
int ns__mul(double a, double b, double *result);//gsoap ns service method: div Divides two values
int ns__div(double a, double b, double *result);//gsoap ns service method: pow Raises a to b
int ns__pow(double a, double b, double *result);

注意ns__add中的“__”为双下划线。

生成头文件calc.h

也可通过使用wsdl文件通过wsdl2h指令生成头文件,如下:

wsdl2h使用方法

wsdl2h用作wsdl和.h文件的转换。soapcpp2用头文件生成客户端/服务端等开发需要的h和cpp文件。
经常使用的一些指令如下:-o filename.h   将wsdl转化为filename.h头文件。-s         不生成STL代码-c         生成纯C风格的头文件,这将去除C++的一些特性-n  name         使用name代替默认前缀ns-t filename.dat  使用filename.dat代替默认的typemap.dat文件-zX        兼容之前的X版本

生成服务端和客户端(代理)程序

然后通过使用soapcpp2指令生成对应的soap代理代码,soapcpp2的常用选项和使用方法如下:

soapcpp2使用方法

wsdl2h用作wsdl和.h文件的转换。soapcpp2用头文件生成客户端/服务端等开发需要的h和cpp文件。经常使用的一些指令如下:-i     生成server的proxy和object,这种object继承于soap struct。-j     和-i类似,区别在于生成的代理类不继承于soap struct,而是包含了包含了一个soap结构的指针。此种方式生存的代理类便于互相通信-C    仅生成客户端client代码-S    仅生成服务端server代码-x    不生成xml文件。不用此项的话,将对头文件中定义的每个operation生成一个描述性的xml文件-L    不生成soapClientLib文件和soapServerLib文件-p name  修改文件名前缀,代替soap-q name  指定代理类和对象使用的名空间name,包含文件名前缀

可以分别通过

soapcpp2 -S -i calc.h

soapcpp2 -C -i calc.h

生成服务端和客户端(代理)程序soapcalcService.cpp,soapcalcProxy.cpp。

完整的makefile


HDR_CALC:=calc.h
SRC_SERVER:=calcServer.cc
SRC_CLIENT:=calcClient.ccSOAP_SRV:=soapC.cpp soapcalcService.cpp
SOAP_CLT:=soapC.cpp soapcalcProxy.cppLIBS:=-lgsoap++all: server client#-i : 生成从soap结构继承的C ++服务代理和对象。
${SOAP_SRV}:${HDR_CALC}soapcpp2 -S -i ${HDR_CALC}${SOAP_CLT}:${HDR_CALC}soapcpp2 -C -i ${HDR_CALC}client:${HDR_CALC} ${SOAP_CLT}g++ -o client ${SRC_CLIENT} ${SOAP_CLT} ${LIBS}server:${HDR_CALC} ${SOAP_SRV}g++ -o server ${SRC_SERVER} ${SOAP_SRV} ${LIBS}clean:rm -rf client server *.xml *.nsmap soap*

客户端&服务端代码

服务端代码calcServer.cc

#include "soapcalcService.h"
#include "calc.nsmap"int main(int argc, char **argv)
{ calcService calc;if(argc < 2){fprintf(stderr, "Usage: calcserver++ <port>\n");exit(0);}if (argc < 2)calc.serve();   /* serve as CGI application */else{ int port = atoi(argv[1]);if (!port){ fprintf(stderr, "Usage: calcserver++ <port>\n");exit(0);}/* run iterative server on port until fatal error */if (calc.run(port)){ calc.soap_stream_fault(std::cerr);exit(-1);}}return 0;
} int calcService::add(double a, double b, double *result)
{ *result = a + b;return SOAP_OK;
} int calcService::sub(double a, double b, double *result)
{ *result = a - b;return SOAP_OK;
} int calcService::mul(double a, double b, double *result)
{ *result = a * b;return SOAP_OK;
} int calcService::div(double a, double b, double *result)
{ if (b)*result = a / b;else{ char *s = (char*)soap_malloc(this, 1024);//    (SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't divide %f by %f</error>", a, b);snprintf(s, 1024, "<error xmlns=\"http://tempuri.org/\">Can't divide %f by %f</error>", a, b);return soap_senderfault("Division by zero", s);}return SOAP_OK;
} int calcService::pow(double a, double b, double *result)
{ *result = ::pow(a, b);if (soap_errno == EDOM)   /* soap_errno is like errno, but compatible with Win32 */{ char *s = (char*)soap_malloc(this, 1024);//    (SOAP_SNPRINTF(s, 1024, 100), "<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>", a, b);snprintf(s, 1024, "<error xmlns=\"http://tempuri.org/\">Can't take power of %f to %f</error>", a, b);return soap_senderfault("Power function domain error", s);}return SOAP_OK;
}

客户端代码calcClient.cc

#include "soapcalcProxy.h"
#include "calc.nsmap"char server[256] = "http://127.0.0.1:";int main(int argc, char **argv)
{ if (argc < 5){ fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num port\n");exit(0);}double a, b, result;a = strtod(argv[2], NULL);b = strtod(argv[3], NULL);calcProxy calc;strcat(server, argv[4]);calc.soap_endpoint = server;switch (*argv[1]){ case 'a':calc.add(a, b, &result);break;case 's':calc.sub(a, b, &result);break;case 'm':calc.mul(a, b, &result);break;case 'd':calc.div(a, b, &result);break;case 'p':calc.pow(a, b, &result);break;default:fprintf(stderr, "Unknown command\n");exit(0);}if (calc.error)calc.soap_stream_fault(std::cerr);elseprintf("result = %g\n", result);return 0;
}

运行

一个终端:
$ ./server 121212另一个终端:
$ ./client add 123 234 121212
result = 357

整体流程

【gSOAP】gSOAP生成服务代理和对象C语言代码示例相关推荐

  1. python求扇形面积_Python随机生成均匀分布在单位圆内的点代码示例

    Python有一随机函数可以产生[0,1)区间内的随机数,但是如果我们想生成随机分布在单位圆上的,那么我们可以首先生成随机分布在单位圆边上的点,然后随机调整每个点距离原点的距离,但是我们发现这个距离不 ...

  2. deldir | 生成泰森多边形的一段R语言代码

    看到一段生成在R语言中生成泰森多边形的代码,感觉很有用.这段代码的最初来源是Carson Farmer的个人网站,网址是:https://carsonfarmer.com/2009/09/vorono ...

  3. 生成对抗网络简介(包含TensorFlow代码示例)【翻译】

    判别模型 vs. 生成模型 示例:近似一维高斯分布 提高样本多样性 最后的思考 关于GAN的一些讨论 最近,大家对生成模型的兴趣又开始出现(OpenAI关于生成模型的案例).生成模型可以学习如何生成数 ...

  4. java rtmp推流_视频直播生成推流和播放地址的Java代码示例

    概述 直播推流地址和播放地址本身没有API接口,需要在客户端自行拼接地址,然后使用推流工具或者播放器对其推流或播放.本文主要介绍如何生成直播的推流以及播放地址. 详细信息 视频直播生成推流和播放地址的 ...

  5. 视频直播生成推流和播放地址的Java代码示例

    视频直播生成推流和播放地址的Java示例代码如下所示. import java.math.BigInteger; import java.security.MessageDigest; import ...

  6. Python json使用实例:字符串与对象互转代码示例

  7. 干撸一个Node环境的PDF生成服务

    干撸一个Node环境的PDF生成服务 用到的库 介绍 代码片段 Http请求处理 生成PDF 样式展示 签名图片处理 PDF排版 结语 用到的库 express:Express 是一个保持最小规模的灵 ...

  8. gsoap应用---利用gsoap工具生成代码

    1.gsoap是什么? The gSOAP toolkit is an open source C and C++ software development toolkit forSOAP/XML W ...

  9. Web Serveice服务代理类生成及编译

    一.生成代理类 对于web service服务和wcf的webservice服务,我们都可以通过一个代理类来调用. 怎么写那个代理类呢?通过一个工具生成即可!!微软为我们提供了一个wsdl.exe的W ...

最新文章

  1. 水管工游戏 (深搜)
  2. 探秘Hadoop生态12:分布式日志收集系统Flume
  3. Linux源代码软件安装,Linux软件安装:源代码与软件安装
  4. canal应用一:基于mysql binlog的日志解析工具
  5. 【python】hashlib.shasha256练习注册 --笔记
  6. java IO(四):键盘录入
  7. initrd的启动过程
  8. leetcode题库124-- 二叉树中的最大路径和
  9. 20190818 思维导图简易教程
  10. c语言上机南开100题,全国计算机三级网络技术C语言南开上机南开100题(WORD版)
  11. 世界各主要国家及组织的大数据战略
  12. 三种经典网页音乐播放器
  13. 硬件设计——PWM原理与设计
  14. arcgis js for JavaScript 4.X 移动轨迹动画
  15. 手机浏览器devtools_浏览器DevTools的秘诀:启动,网络和性能
  16. 读博会改变人的性格吗?
  17. 如何备份和还原PS4保存数据
  18. 如何在素材中心中下载字体并安装?
  19. linux作业管理系统pbs,集群上作业提交系统LSF和PBS的使用与简介
  20. 一款轻量级的markdown编辑器

热门文章

  1. 2019.7.26数组
  2. setTimeout和setInterval
  3. 性能测试用例(转载)
  4. [Project Euler] 来做欧拉项目练习题吧: 题目013
  5. [BZOJ 3028]食物(生成函数)
  6. lvs,haproxy实现负载均衡
  7. Flask 框架下 Jinja2 模板引擎高层 API 类——Environment
  8. 【原创】leetCodeOj --- Find Peak Element 解题报告
  9. OpenJTAG与JLink的区别比较
  10. postgreSQL源码分析——索引的建立与使用——B-Tree索引(2)