一. 安装gsoap

下载地址:http://sourceforge.net/projects/gsoap2/files/

解压安装:./configure --prefix=/usr/local/gsoap && make && make install

示例目录:gsoap-2.8/gsoap/samples 有各类语言使用接口方法

  1. async chaining gmt Makefile mashup README.txt udp xml-rpc-json
  2. atom chaining++ googleapi Makefile.am mashup++ rest varparam
  3. autotest curl hello Makefile.cpp_proxy_rules mtom roll wcf
  4. aws databinding httpcookies Makefile.cpp_proxy_rules_j mtom-stream router webserver
  5. calc dime link Makefile.cpp_rules oneway rss wsa
  6. calc++ dom link++ Makefile.c_rules oneway++ ssl wsrm
  7. calc_vs2005 factory lu Makefile.defines polytest template wsse
  8. calc_xcode factorytest magic Makefile.in primes testmsgr wst

二. 编写demo

定义函数接口,写chw.h文件

  1. //gsoap ns service name: chw Simple calculator service
  2. //gsoap ns service style: rpc
  3. //gsoap ns service encoding: encoded
  4. //gsoap ns service namespace:
  5. //gsoap ns service location:
  6.  
  7. //gsoap ns schema namespace: urn:chw
  8.  
  9. //gsoap ns service method-documentation: add Sums two values
  10. int add(int a, int b, int *result);
  11.  
  12. //gsoap ns service method-documentation: sub Subtracts two values
  13. int sub(int a, int b, int *result);

使用命令:soapcpp2 -c -x chw.h

-c 产生纯C代码,否则是C++代码(与头文件有关)

-I 指定import路径

-x 不要产生XML示例文件

生成文件有:

  1. [root@Logcen5 test]# ls
  2. chw.h soapClient.c soapH.h soapServer.c soapStub.h
  3. soapC.c soapClientLib.c soap.nsmap soapServerLib.c

查看soapStub.h文件

  1. /******************************************************************************\
  2. * *
  3. * Client-Side Call Stub Functions *
  4. * *
  5. \******************************************************************************/
  6.  
  7. /** Web service synchronous operation 'soap_call_add' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */
  8. SOAP_FMAC5 int SOAP_FMAC6 soap_call_add(struct soap *soap, const char *soap_endpoint, const char *soap_action, int a, int b, int *result);
  9. /** Web service asynchronous operation 'soap_send_add' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */
  10. SOAP_FMAC5 int SOAP_FMAC6 soap_send_add(struct soap *soap, const char *soap_endpoint, const char *soap_action, int a, int b);
  11. /** Web service asynchronous operation 'soap_recv_add' to receive a response message from the connected endpoint, returns SOAP_OK or error code */
  12. SOAP_FMAC5 int SOAP_FMAC6 soap_recv_add(struct soap *soap, int *result);
  13.  
  14. /** Web service synchronous operation 'soap_call_sub' to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */
  15. SOAP_FMAC5 int SOAP_FMAC6 soap_call_sub(struct soap *soap, const char *soap_endpoint, const char *soap_action, int a, int b, int *result);
  16. /** Web service asynchronous operation 'soap_send_sub' to send a request message to the specified endpoint and SOAP Action header, returns SOAP_OK or error code */
  17. SOAP_FMAC5 int SOAP_FMAC6 soap_send_sub(struct soap *soap, const char *soap_endpoint, const char *soap_action, int a, int b);
  18. /** Web service asynchronous operation 'soap_recv_sub' to receive a response message from the connected endpoint, returns SOAP_OK or error code */
  19. SOAP_FMAC5 int SOAP_FMAC6 soap_recv_sub(struct soap *soap, int *result);
  20.  
  21. /******************************************************************************\
  22. * *
  23. * Server-Side Operations *
  24. * *
  25. \******************************************************************************/
  26.  
  27. /** Web service operation 'add' implementation, should return SOAP_OK or error code */
  28. SOAP_FMAC5 int SOAP_FMAC6 add(struct soap*, int a, int b, int *result);
  29. /** Web service operation 'sub' implementation, should return SOAP_OK or error code */
  30. SOAP_FMAC5 int SOAP_FMAC6 sub(struct soap*, int a, int b, int *result);

另外需要从gsoap拷贝两个文件过来stdsoap2.c和stdsoap2.h,方便gcc编译不报错!

编写自己的服务端。server.c

  1. #include <stdio.h>
  2. #include "soapH.h"
  3. #include "soap.nsmap"
  4.  
  5. int main(int argc, char *argv[])
  6. {
  7. struct soap soap;
  8. SOAP_SOCKET m, s;
  9. int ret;
  10. soap_init(&soap);
  11. if (argc < 2)
  12. soap_serve(&soap);
  13. else
  14. {
  15. m = soap_bind(&soap, NULL, atoi(argv[1]), 100);
  16. if (!soap_valid_socket(m))
  17. {
  18. soap_print_fault(&soap, stderr);
  19. exit(-1);
  20. }
  21. fprintf(stderr, "Socket connection successful: master socket = %d\n", m);
  22. for ( ; ; )
  23. {
  24. s = soap_accept(&soap);
  25. fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
  26. if (!soap_valid_socket(s))
  27. {
  28. soap_print_fault(&soap, stderr);
  29. exit(-1);
  30. }
  31. soap_serve(&soap);
  32. soap_end(&soap);
  33. }
  34. }
  35. return 0;
  36. }
  37.  
  38. int add(struct soap *soap, int a, int b, int *result)
  39. {
  40. *result = a + b;
  41. return SOAP_OK;
  42. }
  43.  
  44. int sub(struct soap *soap, int a, int b, int *result)
  45. {
  46. *result = a - b;
  47. return SOAP_OK;
    }

编译命令:gcc -o ser server.c soapC.c soapServer.c stdsoap2.c 生成可执行程序 ser

编写自己的客户端。client.c

  1. #include "soapH.h"
  2. #include "soap.nsmap"
  3.  
  4. const char server[] = "http://localhost:8888";
  5.  
  6. int main(int argc, char *argv[])
  7. {
  8. struct soap soap;
  9. int a, b, result;
  10.  
  11. if (argc < 4)
  12. {
  13. fprintf(stderr, "Usage: [add|sub|mul|div|pow] num num\n");
  14. exit(0);
  15. }
  16. a = atoi(argv[2]);
  17. b = atoi(argv[3]);
  18.  
  19. soap_init(&soap);
  20. switch(*argv[1])
  21. {
  22. case 'a':
  23. //soap_call_ns__add(&soap, server, "", a, b, &result);
  24. soap_call_add(&soap, server, "", a, b, &result);
  25. break;
  26. case 's':
  27. //soap_call_ns__sub(&soap, server, "", a, b, &result);
  28. soap_call_sub(&soap, server, "", a, b, &result);
  29. break;
  30. default:
  31. fprintf(stderr, "Unknown command\n");
  32. exit(0);
  33. }
  34. if (soap.error)
  35. {
  36. soap_print_fault(&soap, stderr);
  37. exit(1);
  38. }
  39. else
  40. printf("result = %d\n", result);
  41. soap_destroy(&soap);
  42. soap_end(&soap);
  43. soap_done(&soap);
  44.  
  45. return 0;
  46. }

编译命令:gcc -o cle client.c soapC.c soapClient.c stdsoap2.c生成可执行程序 cle

测试:

在一个窗口执行:./ser 8888

  1. [root@Logcen5 test]# ./ser 8888
  2. Socket connection successful: master socket = 3

另外一个窗口执行:./cle add 2 3

  1. [root@Logcen5 test]# ./cle add 2 3
  2. result = 5

gsoap使用的更多相关文章

  1. gsoap设置超时

    1.修改gsoap自动生成的代码才能进行超时设置(我这边访问web service的代码都是gsoap工具自动生成.根据wsdl接口) 2.找到生成的soapwwwsdlBindingProxy.cp ...

  2. gSOAP MTOM

    前言 需要准备的知识:wsdl,soap,gSOAP,C++,fidder. 首先介绍几个相关的概念 1.MTOM基础概念      MTOM(Message Transmission Optimiz ...

  3. gsoap框架下的onvif程序流程分析

    SOAP_FMAC5 int SOAP_FMAC6 soap_serve(struct soap *soap) { do { unsigned int k = soap->max_keep_al ...

  4. 基于gSOAP使用头文件的C语言版web service开发过程例子

    基于gSOAP使用头文件的C语言版web service开发过程例子 一服务端 1 打开VS2005,创建一个工程,命名为calcServer. 2 添加一个头文件calc.h,编辑内容如下: 1// ...

  5. gSoap的 “error LNK2001: 无法解析的外部符号 _namespaces”解决方法

    gSoap是C/C++开发webService服务第三方的公开类库. 出现上述错误是因为缺少必要的头文件导致的. 在用wsdl2h生成头文件的时候,一并生成了类似 xx.nsmap 的文件,这个文件实 ...

  6. 在Windows下用gSoap实现简单加法实例

    实现一个简单的a+b程序,在服务器端写一个程序,里面包含了a+b的函数,然后通过客户端代码向其发送两个数字,在服务器运算得到结果返回给客户端显示出来. 1.在gSoap的官网上下载文件夹,本人的版本是 ...

  7. [转贴]gsoap使用心得!

    最近换了个工作环境,现在在大望路这边上班,呵,刚上班接到的任务就是熟悉gsoap!废话少说,现在开始gSoap学习! gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在W ...

  8. [转贴]Windows下gSoap交叉编译环境的搭建

    本人直接就用过gSoap,它是用以C/C++写webservice的利器     交叉编译的时候,有两个很关键的程序:         soapcpp2.exe         wsdl2h.exe ...

  9. 使用GSoap开发WebService客户端与服务端

    Gsoap 编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现, 从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多. 用gsoap开发web service的大致思路 我 ...

  10. gSoap实现ONVIF中xsd__anyType到具体结构类型的转换

    上一篇文章已经粗略计划要讨论gsoap关于序列化/解析编程. 本文则阐述一下关于gsoap生成代码的一些重要特征方法及使用.如题,下我们从ONVIF生成的C码中,挑选简单的一个类型来试验一下与xsd_ ...

随机推荐

  1. 通过ISO镜像简单搭建本地yum仓库

    本文参考链接:https://segmentfault.com/a/1190000015155966 *有时候在我们本地搭建一些Linux上的程序运行环境或者安装一些软件的时候,难免会遇到需要使用yu ...

  2. 「POJ 3268」Silver Cow Party

    更好的阅读体验 Portal Portal1: POJ Portal2: Luogu Description One cow from each of N farms \((1 \le N \le 1 ...

  3. inline-block元素间隙产生及去除方法

    当我们把元素属性display设置成inline-block时,元素之间就会产生间隙 <!DOCTYPE html><html> <head> <meta c ...

  4. PHP curl下载图片的方法

    PHP curl下载图片的方法 <pre> <?php $images = [ 'http://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTKPkia3rx ...

  5. PHP常用的header头部定义

    <?php header('HTTP/1.1 200 OK'); // ok 正常访问 header('HTTP/1.1 404 Not Found'); //通知浏览器 页面不存在 heade ...

  6. [RAM] FPGA的学习笔记——RAM

    1.RAM——随机存取存储器, 分为SRAM和DRAM. SRAM:存和取得速度快,操作简单.然而,成本高,很难做到很大.FPGA的片内存储器,就是一种SRAM,用来存放程序,以及程序执行过程中,产生 ...

  7. nyoj 52-无聊的小明 (模拟, SET)

    52-无聊的小明 内存限制:64MB 时间限制:3000ms Special Judge: No accepted:1 submit:3 题目描述:       这天小明十分无聊,没有事做,但不甘于无 ...

  8. fastjson 1.2.24反序列化导致任意命令执行漏洞分析记录

    环境搭建: 漏洞影响版本: fastjson在1.2.24以及之前版本存在远程代码执行高危安全漏洞 环境地址: https://github.com/vulhub/vulhub/tree/master ...

  9. 2019-10-11:渗透测试,基础学习,php+mysql连接,笔记

    mysql导出数据1,通过工具如phpmyadmin,navicat等2,mysqldump -u -p 库名 > /数据库文件, mysqldump -u -p 库名 表名 > /表数据 ...

  10. SpringBoot之DispatcherServlet详解及源码解析

    在使用SpringBoot之后,我们表面上已经无法直接看到DispatcherServlet的使用了.本篇文章,带大家从最初DispatcherServlet的使用开始到SpringBoot源码中Di ...