摘自:

http://blog.csdn.net/jinpw/article/details/3346844

https://www.cnblogs.com/dkblog/archive/2011/08/19/2145942.html

这两天,接到一个项目,需要在linux程序中调用远程的web应用,通过soap协议。开始上网查了下资料,发现了gsoap库这个好东东^_^。继续在网上搜索例子代码,发现基本都不可编译通过,于是便一边学习一边写了这个最简单的例子,希望对后来者起到一点帮助。

  • 对gsoap的简单介绍,请自己参阅http://gsoap2.sourceforge.net/

下载相应的包,主要有2个工具和源代码:
    wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射
        
soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序

  • 下面这个简单的例子实现的是在客户端输入2个数字,然后远程调用服务端的加法函数,最后返回结果给客户端。

在这里我们不需要wsdl的文件,可以直接从.h文件来生成代码。我们定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下:

  1. //gsoapopt cw
  2. //gsoap ns2 schema namespace: urn:add
  3. //gsoap ns2 schema form: unqualified
  4. //gsoap ns2 service name: add
  5. //gsoap ns2 service type: addPortType
  6. //gsoap ns2 service port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi
  7. //gsoap ns2 service namespace: urn:add
  8. //gsoap ns2 service transport: http://schemas.xmlsoap.org/soap/http
  9. //gsoap ns2  service method-style:      add rpc
  10. //gsoap ns2  service method-encoding:
  11. add http://schemas.xmlsoap.org/soap/encoding/
  12. //gsoap ns2  service method-action:     add ""
  13. int ns2__add( int num1, int num2, int* sum );

然后我们执行soapcpp2 -c add.h,自动生成一些远程调用需要的文件。

接下来我们写一个服务端,创建文件addserver.c

  1. #include "soapH.h"
  2. #include "add.nsmap"
  3. int main(int argc, char **argv)
  4. {
  5. int m, s;
  6. struct soap add_soap;
  7. soap_init(&add_soap);
  8. soap_set_namespaces(&add_soap, namespaces);
  9. if (argc < 2) {
  10. printf("usage: %s <server_port> /n", argv[0]);
  11. exit(1);
  12. } else {
  13. m = soap_bind(&add_soap, NULL, atoi(argv[1]), 100);
  14. if (m < 0) {
  15. soap_print_fault(&add_soap, stderr);
  16. exit(-1);
  17. }
  18. fprintf(stderr, "Socket connection successful: master socket = %d/n", m);
  19. for (;;) {
  20. s = soap_accept(&add_soap);
  21. if (s < 0) {
  22. soap_print_fault(&add_soap, stderr);
  23. exit(-1);
  24. }
  25. fprintf(stderr, "Socket connection successful: slave socket = %d/n", s);
  26. soap_serve(&add_soap);
  27. soap_end(&add_soap);
  28. }
  29. }
  30. return 0;
  31. }
  32. int ns2__add(struct soap *add_soap, int num1, int num2, int *sum)
  33. {
  34. *sum = num1 + num2;
  35. return 0;
  36. }

我们接着写客户端,文件addclient.c

  1. #include "soapStub.h"
  2. #include "add.nsmap"
  3. int add(const char *server, int num1, int num2, int *sum)
  4. {
  5. struct soap add_soap;
  6. int result = 0;
  7. soap_init(&add_soap);
  8. soap_set_namespaces(&add_soap, namespaces);
  9. soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);
  10. printf("server is %s, num1 is %d, num2 is %d/n", server, num1, num2);
  11. if (add_soap.error) {
  12. printf("soap error: %d, %s, %s/n", add_soap.error, *soap_faultcode(&add_soap), *soap_faultstring(&add_soap));
  13. result = add_soap.error;
  14. }
  15. soap_end(&add_soap);
  16. soap_done(&add_soap);
  17. return result;
  18. }

最后写一个测试代码,addtest.c

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int add(const char *server, int num1, int num2, int *sum);
  5. int main(int argc, char **argv)
  6. {
  7. int result = -1;
  8. char server[128] = {0};
  9. int num1;
  10. int num2;
  11. int sum;
  12. if (argc < 4) {
  13. printf("usage: %s <ip:port> num1 num2 /n", argv[0]);
  14. exit(1);
  15. }
  16. strcpy(server,argv[1]);
  17. num1 = atoi(argv[2]);
  18. num2 = atoi(argv[3]);
  19. result = add(server, num1, num2, ∑);
  20. if (result != 0) {
  21. printf("soap error, errcode=%d/n", result);
  22. } else {
  23. printf("%d + %d = %d/n", num1, num2, sum);
  24. }
  25. return 0;
  26. }

到此为止,我们自己的代码已经编写完毕,现在我们来编译服务端和客户端
注意:编译的时候我们需要gsoap包里的源代码文件,把stdsoap2.c和stdsoap2.h文件拷贝到当前目录

我们写一个Makefile文件:

  1. GSOAP_ROOT = /root/gsoap-2.7/gsoap
  2. WSNAME = add
  3. CC = g++ -g -DWITH_NONAMESPACES
  4. INCLUDE = -I$(GSOAP_ROOT)
  5. SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.o
  6. CLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.o
  7. all: server
  8. server: $(SERVER_OBJS)
  9. $(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)
  10. client: $(CLIENT_OBJS)
  11. $(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)
  12. cl:
  13. rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test

然后我们执行make,即可生产addserver程序;make client,生成addtest程序。
让server跑起来,执行./addserver 6666

终端打印出“Socket connection successful: master socket = 3”,那么你的server已经在前台run起来了;
运行客户端,./addtest ip:port num1 num2,返回加法的结果。

OK,一个最简单的soap调用的例子完成了,进深一步的学习请参考http://gsoap2.sourceforge.net/

linux下gsoap的初次使用 -- c风格加法实例的更多相关文章

  1. Onvif开发之Linux下gsoap的使用及移植

    一直以来都是在CSDN上面学习别人的东西,很多次想写点什么但是又无从写起.由于公司项目需要,最近一段时间在研究onvif,在网上找了很多资料,发现资料是非常多,但是很少有比较全的资料,或者资料太多无从 ...

  2. Linux下的压缩解压缩命令详解及实例

    实例:压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip ====================== ...

  3. Linux下gsoap实现webservice功能

    蓝字为关键字,等号=后面为关键字值. 一.介绍 我们用的webservice是根据gsoap编译工具来实现,gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据 ...

  4. Linux下配置环境变量的几个方法实例

    场景:一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量.例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录 ...

  5. Linux下面向TCP连接的C++ Socket编程实例

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口.即Socket提供了操作上述特殊文件的接口,使用这些接口可以实现网络编程. Socket通信流程图 TCP(Transmis ...

  6. Linux下onvi支持h265环境的的搭建:gsoap的安装及生产.c .h文件

     1. 下载gsoap  :http://www.genivia.com/products.html#notice,既Open Source gSOAP版本,并解压进入目录安装,configure后面 ...

  7. Linux下用gSOAP开发Web Service服务端和客户端程序

    网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...

  8. linux下不错的小软件

    1.Shutter截图软件 可以完成基本截图功能,而且还有图片编辑功能,可以涂鸦添加水印等. 以下的截图全部归功于shutter软件. 2.VLC media player 媒体播放器 3.Termi ...

  9. Linux下AT&T汇编语法格式与Intel汇编语法格式异同

    由于绝大多数的国内程序员以前只接触过Intel格式的汇编语言,很少或几乎没有接触过AT&T汇编语言,虽然这些汇编代码都是Intel风格的.但在Unix和Linux系统中,更多采用的还是AT&a ...

随机推荐

  1. EasyNVR RTSP摄像机HLS直播服务器中使用Onvif协议获取设备快照

    我们知道EasyNVR中可以获取快照信息,之前的文章也说明了EasyNVR是如何进行快照抓取的 这里我们使用另一种方法进行快照的抓取 流程 获取设备能力Capabilities 获取设备的能力,并且可 ...

  2. Mybatis中resultMap的基础配置

    一.概述 resultMap 元素是 MyBatis 中最重要最强大的元素.它就是让你远离 90%的需要从结果集中取出数据的 JDBC 代码的那个东西,而且在一些情形下允许你做一些 JDBC 不支持的 ...

  3. 我的Android进阶之旅------>Android使用AlarmManager全局定时器实现定时更换壁纸

    该DEMO将会通过AlarmManager来周期的调用ChangeService,从而让系统实现定时更换壁纸的功能. 更换壁纸的API为android.app.WallpaperManager,它提供 ...

  4. 微软Azure区块链开发工具包三大功能详解

    2018年11月15日,微软宣布了Azure区块链开发工具包,它基于微软的无服务器技术构建,并且利用微软和第三方SaaS,完美集成了区块链.该工具包扩展了微软的区块链开发模板和Azure Blockc ...

  5. ABAP 性能优化001

    红方框里那一步之行很慢,lt_iflos这个内表才200多条数据 1.关键是你from那个表有多少数据.... 注意点: 1.不要用 CORRESPONDING FIELDS OF 2.LT_IFLO ...

  6. ubuntu 搭建 tomcat

    一.下载tomcat 先下载到本地,然后ftp上传到服务器 官方 Apache Tomcat 的下载 2 二.解压安装 先解压 tar zxvf apache-tomcat-7.0.64.tar.gz ...

  7. 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制【转】

    本文转载自:https://blog.csdn.net/freekiteyu/article/details/70082302 Android-Binder进程间通讯机制 概述 最近在学习Binder ...

  8. AiCloud 2.0 AT开发文档【转】

    本文转载自:http://wiki.ai-thinker.com/aicloud/docs/atdevelop AT指令一览表 AiCloud AT指令   指令 描述 AT+CLDSTART 启动云 ...

  9. Codeforces Round #553 (Div. 2) 题解

    昨晚深夜修仙上紫记,虽然不错还是很有遗憾的. A. Maxim and Biology 看完就会做的题,然而手速跟不上 #include<cstdio> #include<iostr ...

  10. 架构设计:系统间通信(34)——被神化的ESB(上)

    1.概述 从本篇文章开始,我们将花一到两篇的篇幅介绍ESB(企业服务总线)技术的基本概念,为读者们理清多个和ESB技术有关名词.我们还将在其中为读者阐述什么情况下应该使用ESB技术.接下来,为了加深读 ...