gsoap编译及使用例子

http://sourceforge.net/projects/gsoap2/

下载gsoap源码

解压:

$ unzip gsoap_2.8.17.zip

编译:

$ cd gsoap-2.8/

$ configure

$ make

$ sudo make install

add.h文件

  1. //gsoap ns service name: add
  2. //gsoap ns service style: rpc
  3. //gsoap ns service encoding: encoded
  4. //gsoap ns service namespace: http://localhost/add.wsdl
  5. //gsoap ns service location: http://localhost/add.cgi
  6. //gsoap ns schema namespace: urn:add
  7. typedef std::string xsd__string;
  8. struct abc {
  9. int a;
  10. double b;
  11. char *c;
  12. };
  13. int ns4__add(int num1, int num2, int* sum);
  14. int ns4__str(xsd__string src, xsd__string *result);
  15. int ns4__abcstruct(struct abc *result);
  16. int ns4__Add100(int InValue, int &result);

addClient.cpp文件

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <string>
  5. #include "soapStub.h"
  6. #include "ns4.nsmap"
  7. #include "soapProxy.h"
  8. using namespace std;
  9. int main(int argc, char **argv)
  10. {
  11. int result = -1;
  12. char server[128] = {0};
  13. if (argc < 2) {
  14. printf("usage: %s <ip:port>\n", argv[0]);
  15. exit(1);
  16. }
  17. strcpy(server,argv[1]);
  18. Proxy add;
  19. add.soap_endpoint = server;
  20. int sum = 0;
  21. result = add.Add100(10, sum);
  22. printf("Add100(10)=%d\n", sum);
  23. result = add.add(3, 4, &sum);
  24. if (result != 0) {
  25. printf("soap error, errcode=%d\n", result);
  26. } else {
  27. printf("%d + %d = %d\n", 3, 4, sum);
  28. }
  29. string str;
  30. result = add.str(string("world"), &str);
  31. if (result != 0) {
  32. printf("soap error, errcode=%d\n", result);
  33. } else {
  34. cout << str << endl;
  35. }
  36. struct abc st;
  37. result = add.abcstruct(&st);
  38. printf("abcstruct:%d %lf %s\n", st.a, st.b, st.c);
  39. return 0;
  40. }

addServer.cpp文件

  1. #include <string>
  2. #include "soapH.h"
  3. #include "soapService.h"
  4. #include "ns4.nsmap"
  5. using namespace std;
  6. int Service::add(int num1, int num2, int *sum)
  7. {
  8. *sum = num1 + num2;
  9. return SOAP_OK;
  10. }
  11. int Service::str(string src, string *result)
  12. {
  13. *result = string("hello ") + src;
  14. cout << *result << endl;
  15. return 0;
  16. }
  17. int Service::abcstruct(struct abc *result)
  18. {
  19. result->a = 1;
  20. result->b = 2.0;
  21. result->c= new char[2];
  22. result->c[0] = ‘a‘;
  23. result->c[1] = ‘\0‘;
  24. return 0;
  25. }
  26. int Service::Add100(int num, int &result)
  27. {
  28. result = num + 100;
  29. return 0;
  30. }
  31. int main(int argc, char **argv)
  32. {
  33. int m, s;
  34. Service add;
  35. if (argc < 2)
  36. {
  37. printf("usage: %s <server_port> /n", argv[0]);
  38. return -1;
  39. }
  40. if (add.run(atoi(argv[1])))
  41. {
  42. printf( "add service run failed\n" );
  43. return -1;
  44. }
  45. return 0;
  46. }

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 soapService.o $(WSNAME)Server.o
  6. CLIENT_OBJS = soapC.o soapProxy.o $(WSNAME)Client.o
  7. all: server client
  8. server: $(SERVER_OBJS)
  9. $(CC) $(INCLUDE) -o $(WSNAME)Server
    $(SERVER_OBJS) -lgsoapssl++ -lssl -lcrypto -lz
  10. client: $(CLIENT_OBJS)
  11. $(CC) $(INCLUDE) -o $(WSNAME)Client
    $(CLIENT_OBJS) -lgsoapssl++ -lssl -lcrypto -lz
  12. clean:
  13. rm -f *.o *.xml *.a *.wsdl *.nsmap
    soapH.h $(WSNAME)Stub.* $(WSNAME)server
    ns.xsd

编译:

soapcpp2 -i add.h

make

运行:

服务器

./addServer 9981

客户端

./addClient http://localhost:9981

以下是打印

Add100(10)=110

3 + 4 = 7

hello world

abcstruct:1 2.000000 a

其他一些总结:

如果自己写example程序,发现编译不过:

soapProxy.o:在函数‘Proxy::~Proxy()’中:

soapProxy.cpp:(.text+0x52):对‘soap::~soap()’未定义的引用

soapProxy.o:在函数‘Proxy::reset()’中:

soapProxy.cpp:(.text+0xec):对‘soap_initialize’未定义的引用

soapProxy.o:在函数‘Proxy::testChinese(char const*, char const*, char**)’中:

soapProxy.cpp:(.text+0x27a):对‘soap_url’未定义的引用

soapProxy.o:在函数‘Proxy::Proxy()’中:

soapProxy.cpp:(.text+0x40d):对‘soap::soap()’未定义的引用

soapProxy.cpp:(.text+0x44b):对‘soap::~soap()’未定义的引用

soapProxy.o:在函数‘Proxy::reset()’中:

soapProxy.cpp:(.text+0xec):对‘soap_initialize’未定义的引用

soapProxy.o:在函数‘Proxy::testChinese(char const*, char const*, char**)’中:

soapProxy.cpp:(.text+0x27a):对‘soap_url’未定义的引用

collect2: error: ld returned 1 exit status

解决方法:

Makefile不用-lgsoap或者-lgsoapssl++方式链接gsop

而是直接把std2Soap.cpp 加入到工程中一起与自己的程序编译

gsoap下的samples示例工程

oneway  与心跳包有关

httpcookies  cookies有关

要支持SSl,GZIP,编译命令中加 -DWITH_OPENSSL -DWITH_GZIP -lssl -lcrypto -lz

中文乱码解决:

struct soap soap;

soap_init(&soap);

soap_set_mode(&soap, SOAP_C_UTFSTRING); // 程序中加这个

设置连接超时(秒为单位):

soap->connect_timeout=3;

设置收发超时:

soap->send_timeout = 30;

soap->recv_timeout = 30;

作者:帅得不出门 程序员群:31843264

时间: 2024-11-06 03:08:52

gsoap编译及使用例子的相关文章

一个小玩具:NDK编译FFmpeg的例子

FFmpeg NDK编译 和最简单的APK 准备 硬件: 一台电脑,实验在Lenovo T430上 一个Android设备,实验在 三星S3/A7 编译环境: Ubuntu 14.04 (ant\java等命令必须支持) 工具包: NDK: https://dl.google.com/android/ndk/android-ndk32-r10b-linux-x86_64.tar.bz2 SDK:https://dl.google.com/android/adt/adt-bundle-linux-

gsoap + onvif 编译

/*********************************************gsoap onvif 客户端功能开发****************************************************************************************/ 1.编译ssl ,其中安装目录会被gsoap编译时用到见17行 2.gsoapunzip gsoap_2.8.34.zip./configure --with-openssl=/home/l

[编程菜谱]如何在Ubuntu下编译链接最简单的curl例子

简介:有点时间没有在Linux环境下战斗了,刚好需要研究一下curl的API使用,试图编译链接了一个最简单的curl例子,发现了很多问题,最后决定把过程记录下来,以防止未来再犯类似的简单错误,如果能帮助到某位过客,也算是幸事! 食材: Ubuntu 12.04 64-bit 安装了基本的gcc.g++.make,恕不赘述 simple.c 一个最最简单的官网curl的c实例,万丈高楼平地起嘛 步骤: 1. 首先要安装curl的开发环境 sudo apt-get install libcurl4-

纯c gSoap实现WebService

一.系统环境linux操作系统kernel2.4.2,安装gsoap2.6到目录/usr/local/gsoap二.gSOAP的简要使用例子下面是一个简单的例子,实现一个加法运算的WebService,具体功能是cli端输入num1和num2,server端返回一个num1和num2相加的结果sum. 1. 首先,我们需要做的是写一个函数声明文件,来定义接口函数ns__add,文件名字为add.h,内容如下: //gsoap ns service name: add//gsoap ns serv

gsoap开发webservice

gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多.绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库.与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来. gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构

Ubuntu 16.04上编译SkyEye的测试程序

一.首先确保Ubuntu系统上已经安装了Skyeye.skyeye-testsuite和arm-linux-gcc交叉编译工具链,如果没有安装请参考: 1.Skyeye的安装:http://www.cnblogs.com/softhal/p/5697500.html 2.arm-linux-gcc的安装:http://www.cnblogs.com/softhal/p/5699381.html 二.编译skyeye-testsuite中的例子: 1.进入skyeye-testsuite的安装目录

使用D语言开始Windows桌面应用程序 -- Dgui库编译与使用

在Windows上开发桌面应用程序的工具有很多,早期的VB,VC+MFC等等,.Net出来后,使用C#开发桌面应用程序就更加容易,C#对Windows的面向对象方式的封装使得程序开发更新方便,重用性也大大提高,但总是要带着.Net巨大的环境. 使用Dgui不仅可以去掉.Net巨大的环境,而且Dgui的类封装结构和C#的Form结构差不多,使得程序开发起来也非常方便. 一.下载Dgui库 Dgui库是开源项目,项目地址:https://bitbucket.org/dgui/dgui ,最后更新日期

Linux命令行下编译Android NDK的示例代码

这几天琢磨写一个Android的Runtime用来加速HTML5 Canvas,让GameBuilder+CanTK 不但开发速度快,运行速度也能接近原生应用.所以花了点时间研究 Android NDK,网上的资料都是讲IDE里的编译方法,这里记录一下命令行下的编译方法,供有需要的朋友参考. 这里以编译hello-gl2为例: 0.安装Android NDK/SDK,设置PATH变量(根据具体情况调整) PATH=$PATH:/work/android/android-sdk-linux/pla

gsoap使用总结

gsoap使用总结 >>用C实现WebService,gsoap是最好的选择了.近一个月都在折腾这个,做个总结吧,估计会写得比较长.因为其中碰到了不少问题,但最终都解决调了.>>快速开始  1. gsoap官网.遇到问题时,官网往往是最能提供帮助的地方.     http://gsoap2.sourceforge.net/  2. 几个值得参考的链接.     GSoap使用心得: http://www.cppblog.com/qiujian5628/archive/2008/10