gSoap使用入门(1)----由wsdl文件生成头文件

2023-11-12

向导 1.1节中提供了gSoap开发包的下载地址http://sourceforge.net/projects/gsoap2

下载最新gSoap程序包
解压后在\gsoap\bin\win32(windowsXP下,其它操作系统就自己选择)下找到 编译器soapcpp2.exe 和wsdl解析工具 wsdl2h.exe,这两个文件也可以重新编译生成,用户向导中有介绍,此处就不多说,用现成的了。

 

进入主题:开发客户端程序
    (1)客户端服务端通信必不可少的一个东西:接口定义。
          gSoap使用中,需要此接口文件(也就是以后常提到的头文件)此文件可以两种方式得到:
          1: 由现有的wsdl文件转换得到(本文使用这种方式)
          2: 自己编写

    (2)两个工具的用途
          wsdl2h.exe--------名字就能看出来,完成 wsdl文件(.wsdl)到(2)头文件(.h)的转换,即由写好的wsdl格式的接口定义文件转换为C/C++格式的头文件         

          soapcpp2.exe------根据接口头文件生成应用程序客户端和服务端的框架文件(soapClient.cpp、soapServer.cpp等).

 

结合例子说明过程
示例:引用向导中的例子--计算器
      由wsdl文件生成接口头文件
      wsdl文件URL地址:http://www.cs.fsu.edu/~engelen/calc.wsdl
      操作流程
      a) 程序->运行 输入cmd 启动命令行;
      b) 打开wsdl2h.exe所在文件路径(不打开的话下面输入时要记着输入全路径,不然找不着了);
      c) 输入:wsdl2h.exe -o cal.h http://www.cs.fsu.edu/~engelen/calc.wsdl,
         其中
             "wsdl2h.exe",因为第二步中打了wsdl2h文件所在路径,所以此处可以直接用了,若没打开要输入所在完整路径
             "cal.h"为生成的头文件名,此文件的保存位置在wsdl2h.exe同一文件目录下(要修改的话要请参照命令行语法规则,此处不多说了,有点脱离主题)            

       "-o"是生成选项,表示输出,也可以增加其它选项(向导中出现 "-s -o"、"-c -o"等),具体选项说明请参照向导中介绍。
             "http://www.cs.fsu.edu/~engelen/calc.wsdl"是wsdl文件的位置,此处是在网络地址(这个地址是可以用的),如果wsdl文件在本地的也可以,路径设置好就OK了
         注意:以上四项中每项间都有空格分开 不要手误啊!
      d) 回车 运行吧,看提示信息,没有提示故障的话,查找cal.h吧(cal.h的保存路径要记好啊,自己设置的);
      e) 得到cal.h后,打开可以看到接口定义;
      f) 在命令行中 输入:soapcpp2.exe cal.h
         其中
             "soapcpp2.exe",此处把soapcpp2.exe和wsdl2h.exe放在同一目录下了,且前面已打开此路径;
             "cal.h"即由wsdl生成的头文件,此文件保存位置与soapcpp2.exe相同,故此处可这样输入,若不同还须设置文件路径;
             同样两项之间也有空格!
             可以增加控制选项如"soapcpp2.exe -C cal.h"则只生成客户端所需文件, "soapcpp2.exe -S calc.h"则只生成服务端所需文件
      g) 回车 运行。
  如果提示找不到文件 stlvector.h,因为cal.h文件中引用了文件stlvector.h;解决方法:开发包\gsoap\import目下有此文件,复制一份到cal.h所在目录。
         注意:此过程中要检查生成的编译信息,确保没有警告信息出现(警告信息可能是gSoap不支持的内容,如果不去除,程序运行故障很难找到根本原因),另不能只看编译结果成功就认为是正确的,存在警告信息也显示为编译成功!!
      h) 编译成功,生成的框架文件保存位置与cal.h在同一目录下,包括:calc.nsmap、soapC.cpp、soapcalcObject.h、soapcalcProxy.h、soapClient.cpp、soapClient.lib

、soapH.h、soapServer.cpp、soapServer.Lib、soapStub.h和接口的请求应答xml文件。
    其中
      calc.nsmap 为命名空间定义文件;
      soapClient.cpp 客户端文件
            soapServer.cpp 服务端文件
            soapcalcProxy.h 代理用到
            soapStub.h 此文件中为程序中要用到的接口的声明(将cal.h中的接口经过处理后,在程序中供调用的接口)
            xml文件 为接口的xml格式,可以据此帮助调试等。。。
            其它文件作用还没完全搞明白,向导中有说明,此处不说了以免误导^_^
      i) 编译过程完成。下面开始程序(客户端)
         VC6中新建空的win32控制台工程,新建源文件calcClient.cpp;
         复制编译生成的文件(包括cal.h和stlvector)到程序目录中;
         在工程中添加文件calc.nsmap、soapC.cpp、soapClient.cpp、soapH.h、soapStub.h(使用代理添加soapcalcProxy.h);
         编译,提示无法找到文件stdsoap2.h、stdsoap2.cpp文件,这两个文件为gSoap的源码文件,在\gsoap文件夹中找到这两个文件,复制到程序目录下并添加到工程中;
         在calcClient.cpp文件中 添加语句#include "soapH.h", #include "calc.nsmap"

///calcClient.cpp源码//
#include <stdio.h>
#include "soapH.h"
#include "calc.nsmap"

const char server[] = "http://websrv.cs.fsu.edu/~engelen/calcserver.cgi";

int main(int argc, char **argv)
{
 struct soap soap;
 double a, b, result;
 if (argc < 4)
 { fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");
 exit(0);
 }
 soap_init(&soap);
 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);
 return 0;
}
//calcClient.cpp源码 
其中soap_call_ns2__add、soap_call_ns2__sub、soap_call_ns2__mul、soap_call_ns2__div、soap_call_ns2__pow为接口函数,在soapStub.h中可以找到函数声明。
^_^搞定一步^_^
calcClient.cpp内容引用了gSoap开发包中例程中calc的源码,函数名略有修改动!代码中没有做接口执行故障检测,仅供参考。
这个例子中还有很多东西没写明白,比如gSoap中接口函数的定义的原则、gSoap的初始化和结束清理等。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

gSoap使用入门(1)----由wsdl文件生成头文件 的相关文章

随机推荐

  • ECCV2018论文,以及相关比赛地址

    原 ECCV 2018论文解读及资源集锦 10月17日更新 含全部论文下载链接 2018年08月20日 17 41 38 extremevision 阅读数 8983 div class operating div
  • 三维模型轻量化示例

    声明 本文是学习GB T 42869 2023 机械产品三维模型简化与轻量化要求 而整理的学习笔记 分享出来希望更多人受益 如果存在侵权请及时联系我们 1 范围 本文件规定了机械产品三维模型的简化要求和轻量化要求 本文件适用于机械产品三维模
  • 2019多益网络秋招视频面试算法题:将一个长度为n的数组A的元素循环右移k位

    题目 将一个长度为n的数组A的元素循环右移k位 比如数组 1 2 3 4 5 循环右移3位之后变成 3 4 5 1 2 方法一 首先考虑k 如果k能被数组长度len整除 那么数组顺序不变 可以直接输出数组 如果不能整除 得到k k len
  • PostgreSQL 时间函数 extract函数和epoch 新纪元时间的使用

    Extract 属于 SQL 的 DML 即数据库管理语言 函数 同样 InterBase 也支持 Extract 它主要用于从一个日期或时间型的字段内抽取年 月 日 时 分 秒数据 因此 它支持其关健字 YEAR MONTH DAY HO
  • 组合游戏系列3: 井字棋、五子棋的OpenAI Gym GUI环境

    继上一篇完成了井字棋 N子棋 的minimax 最佳策略后 我们基于Pygame来创造一个图形游戏环境 可供人机和机器对弈 为后续模拟AlphaGo的自我强化学习算法做环境准备 OpenAI Gym 在强化学习领域是事实标准 我们最终封装成
  • python面试题一个字符串是否由重复的子字符串组成

    一 给定一个非空的字符串 判断它是否可以由它的一个子串重复多次构成 给定的字符串只含有小写英文字母 并且长度不超过10000 输入 abab 输出 True 解释 可由子字符串 ab 重复两次构成 输入 aba 输出 False 输入 ab
  • 直播网站服务器带宽多少合适,开直播网速要求(开直播要多少兆宽带)

    您好 开直播也是需要分情况的吧 如果是游戏直播 打电脑游戏至少需要100M的电信宽带 体验会好一些 当然网速越高越好 如果是一般直播 上行带宽满足10M就 开直播主要是对上行速度要求比较高 有条件的话建议直接办个百兆的宽带 现在一般运营商上
  • 数据爬取与SOCKS5的完美结合

    大家好 在进行数据爬取的过程中 我们经常需要应对反爬机制和IP限制等问题 今天 我将与大家分享一种强大的工具 数据爬取与SOCKS5代理的完美结合 帮助我们更高效地获取所需数据 1 什么是SOCKS5代理 SOCKS5是一种网络代理协议 能
  • AppsFlyer 研究(十一)配置 Google Ads MCC 获取 LINK ID

    配置 Google Ads MCC 获得 LINK ID 步骤如下 1 打开Google Ads Manager accounts链接 2 点击 Create a manager account 按钮 进入创建管理账号页面 3 填写账号相关
  • 排序算法(Sort)

    预计阅读时间 10分钟 目录 第一部分 冒泡排序 介绍 过程 代码 第二部分 选择排序 介绍 过程 代码 第三部分 插入排序 简介 过程 代码 第四部分 堆排序 简介 过程 代码 第五部分 归并排序 简介 过程 代码 第六部分 快速排序 简
  • 以太坊私有链重启后账户余额清零

    以太坊私有链重启后账户余额清零 问题描述 问题原因 问题解决 这个问题一直折磨了我两天 最后终于在luo同学和lin同学的帮助下解决了该问题 问题描述 使用 geth 搭建私有链 搭建完后新建账户并通过 miner start 挖矿获得以太
  • 【STM32知识点】关于不同外设中断标志位清除的使用笔记

    在使用中断函数的时候 我们往往忘记在中断服务函数内清除中断标志位而导致一些未知错误 以下我总结了几个外设关于中断标志位的清除问题 定时器 1 在程序有使用到中断的情况下 定时器在使能之前需要先清除更新中断标志位 否则会出现定时器一使能就进入
  • RocketMQ学习笔记

    基本概念 MessageQueue 消息存储的队列 topic 由一个或多个队列组成 逻辑概念 tag msg标签 目录 基本概念 架构 分布式事务 RocketMQ事务 RocketMQ安装 下载 开启NameServer 启动Broke
  • Java获取图片传到前端,生成二维码给前端

    可以将本地图片导入然后传到前端 也可以生成一个随意长度的二维码保存到本地 也可以传到前端 可以直接通过地址栏访问 要记得导入相关pom依赖包 获取本地图片传到前端 param paramm param 功能描述 传图片 GetMapping
  • MATLAB画灰阶窗口图

    一 效果图 先上效果图 二 程序 程序段如下 注释里面都写的很清楚 Author ZXX Date 2021 10 25 Introduction 按需求生成多张图片并保存到指定文件夹下 生成多张3840 2160 w h 的含有窗口 窗口
  • 《操作系统》- 操作系统的运行环境

    目录 一 操作系统的运行机制 1 1 基本概念 1 2 时钟管理 1 3 中断机制 1 3 1 内中断有三种情况 1 3 2 中断的处理过程 1 3 3 断点调试 1 4 原语 1 5 系统数据结构 1 6 系统调用 二 操作系统体系结构
  • 启动游戏提示由于找不到xinput1 3.dll无法继续执行代码?

    最近有Win10的用户在启动游戏的时候 电脑突出弹窗提示由于找不到xinput1 3 dll无法继续执行代码 导致游戏中断无法玩耍 这个要如何解决呢 下面小编就为大家带来详细的解决方法介绍 方法一 1 大家可以自己在本站下载一个叫做 xin
  • 初试Zabbix5.0下使用官方OID监控eNSP数通设备接口状态

    笔者学习Zabbix的初衷是监控园区网络 其中一项是监控在配置MSTP下BPDU Guard Filter及DHCP Snooping后接入交换机或非法DHCP服务器后端口的状态 本篇初试一下整个流程 实验拓扑搭建 拓扑如图 其中AR1 A
  • SpringBoot使用自定义favicon.ico图标

    一直不喜欢写这东西 但是有些问题浪费我大量时间最终得以解决还是想记录一下过程 SpringBoot使用自定义favicon ico 1 找个ICO图标放在resources static目录下 名字是favicon ico 2 在html文
  • gSoap使用入门(1)----由wsdl文件生成头文件

    向导 1 1节中提供了gSoap开发包的下载地址http sourceforge net projects gsoap2 下载最新gSoap程序包 解压后在 gsoap bin win32 windowsXP下 其它操作系统就自己选择 下找