加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

用gsoap实现WebService

发布时间:2020-12-16 23:56:13 所属栏目:安全 来源:http://www.voidcn.com/tag/http
导读:gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC OS和UNIX下使用C和C++语言编码,集成了SSL功能。 ? 下载地址:http://www.voidcn.com/tag/http://sourceforge.net/projects/gsoap2 官方网站:http://www.voidcn.com/
gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC OS和UNIX下使用C和C++语言编码,集成了SSL功能。

?

下载地址:http://www.voidcn.com/tag/http://sourceforge.net/projects/gsoap2

官方网站:http://www.voidcn.com/tag/http://genivia.com/Products/gsoap/index.html

?

一、服务器端
1、首先编写 add.h文件:

?

?

[cpp] view plain copy print ?
  1. //gsoap?ns?service?name:?add ??
  2. //gsoap?ns?service?namespace:?http://mail.263.net/add.wsdl ??
  3. //gsoap?ns?service?location:?http://mail.263.net ??
  4. //gsoap?ns?service?executable:?add.cgi ??
  5. //gsoap?ns?service?encoding:?encoded ??
  6. //gsoap?ns?schema?namespace:?urn:add ??
  7. ??
  8. int?ns__add(?int?num1,?int?num2,?int*?sum?);??
//gsoap ns service name: add //gsoap ns service namespace: http://mail.263.net/add.wsdl //gsoap ns service location: http://mail.263.net //gsoap ns service executable: add.cgi //gsoap ns service encoding: encoded //gsoap ns schema namespace: urn:add int ns__add( int num1,int num2,int* sum );

2、用gsoap/bin目录下的soapcpp2.exe程序,生成一些文件。
方法:用cmd执行soapcpp2.exe add.h。

soapcpp2.exe可以带参数执行,具体执行soapcpp2.exe -h查看。(示例:http://www.cppprog.com/2009/0723/138_2.html)

在这个目录下会自动生成许多将来有用的文件,如add.namap,soapH.h,soapC.cpp,soapClient.cpp,soapServer.cpp等文件。

?

3、新建一个win32控制台工程,加入wsock32.lib库,将刚才生成的那些文件添加到工程中。
然后编写addserver.cpp主程序:

[cpp] view plain copy print ?
  1. #include?"soapH.h"????????????//原文是#include?"addH.h"。 ??
  2. #include?"add.nsmap" ??
  3. ??
  4. int?main(int?argc,?char?**argv)??
  5. {??
  6. int?m,?s;??
  7. struct?soap?add_soap;??
  8. soap_init(&add_soap);??
  9. //soap_set_namespaces(&add_soap);????????//原文这个是打开的。 ??
  10. if?(argc?<?2)??
  11. {??
  12. printf("usage:?%s?<server_port>?/n",?argv[0]);??
  13. exit(1);??
  14. }??
  15. else??
  16. {??
  17. m?=?soap_bind(&add_soap,?NULL,?atoi(argv[1]),?100);??
  18. if?(m?<?0)??
  19. {??
  20. soap_print_fault(&add_soap,?stderr);??
  21. exit(-1);??
  22. }??
  23. fprintf(stderr,?"Socket?connection?successful:?master?socket?=?%d/n",?m);??
  24. for?(?;?;?)??
  25. {??
  26. s?=?soap_accept(&add_soap);??
  27. if?(s?<?0)??
  28. {??
  29. soap_print_fault(&add_soap,?"Socket?connection?successful:?slave?socket?=?%d/n",?s);??
  30. soap_serve(&add_soap);//该句说明该server的服务????????//原文是add_serve(&add_soap); ??
  31. soap_end(&add_soap);??
  32. }??
  33. }??
  34. return?0;??
  35. }??
  36. ??
  37. //server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数 ??
  38. int?ns__add(struct?soap?*add_soap,?int?num1,?int?*sum)??
  39. {??
  40. *sum?=?num1?+?num2;??
  41. return?0;??
  42. }??
#include "soapH.h" //原文是#include "addH.h"。 #include "add.nsmap" int main(int argc,char **argv) { int m,s; struct soap add_soap; soap_init(&add_soap); //soap_set_namespaces(&add_soap); //原文这个是打开的。 if (argc < 2) { printf("usage: %s <server_port> /n",argv[0]); exit(1); } else { m = soap_bind(&add_soap,NULL,atoi(argv[1]),100); if (m < 0) { soap_print_fault(&add_soap,stderr); exit(-1); } fprintf(stderr,"Socket connection successful: master socket = %d/n",m); for ( ; ; ) { s = soap_accept(&add_soap); if (s < 0) { soap_print_fault(&add_soap,"Socket connection successful: slave socket = %d/n",s); soap_serve(&add_soap);//该句说明该server的服务 //原文是add_serve(&add_soap); soap_end(&add_soap); } } return 0; } //server端的实现函数与add.h中声明的函数相同,但是多了一个当前的soap连接的参数 int ns__add(struct soap *add_soap,int num1,int *sum) { *sum = num1 + num2; return 0; }

4、编译

编译这个程序,会提示错误,将gsoap_win32目录下stdsoap2.cpp,stdsoap2.h文件加入工程,重新编译如果还有错误,可能是你将add.h生成的文件添加入工程出错的原因。

实际上在编写server程序时,无须带Client的那些文件,还有带Lib的文件也无须添加到工程中。

调试成功之后,在cmd中执行gsoap.exe文件,并设定第一个参数为4567。在IE中输入http://localhost:4567,如果显示xml页面,说明程序已经启动。


二、客户端

1、? 客户端程序代码如下:

[cpp] view plain copy print ?
  1. #include?<stdio.h> ??
  2. #include?<stdlib.h> ??
  3. #include?"stdsoap2.h" ??
  4. #include?"soapH.h" ??
  5. #include?"add.nsmap" ??
  6. ??
  7. int?add(const?char*?server,?int?*sum);??
  8. ??
  9. int?main(int?argc,?char?**argv)??
  10. {??
  11. ?????int?result?=?-1;??
  12. ?????char*?server="http://localhost:4567/";??
  13. ?????int?num1?=?1;??
  14. ?????int?num2?=?2;??
  15. ?????int?sum?=?0;??
  16. ?????result?=?add(server,?num1,?num2,?&sum);??
  17. ?????if?(result?!=?0)??
  18. ?????{??
  19. ?????????printf("soap?err,errcode?=?%d/n",?result);??
  20. ?????}??
  21. ?????else??
  22. ?????{??
  23. ?????????printf("%d+%d=%d/n",?sum?);??
  24. ?????}??
  25. ?????return?0;??
  26. }??
  27. ??
  28. int?add(const?char*?server,?int?*sum)??
  29. {??
  30. ?????struct?soap?add_soap;??
  31. ?????int?result?=?0;??
  32. ?????soap_init(&add_soap);??
  33. ??
  34. ?????soap_call_ns__add(?&add_soap,?server,?"",?sum?);??
  35. ?????if(add_soap.error)??
  36. ?????{??
  37. ?????????printf("soap?error:%d,%s,%s/n",?add_soap.error,?*soap_faultcode(&add_soap),?*soap_faultstring(&add_soap)?);??
  38. ?????????result?=?add_soap.error;??
  39. ?????}??
  40. ?????soap_end(&add_soap);??
  41. ?????soap_done(&add_soap);??
  42. ?????return?result;??
  43. }??
#include <stdio.h> #include <stdlib.h> #include "stdsoap2.h" #include "soapH.h" #include "add.nsmap" int add(const char* server,int *sum); int main(int argc,char **argv) { int result = -1; char* server="http://localhost:4567/"; int num1 = 1; int num2 = 2; int sum = 0; result = add(server,num1,num2,&sum); if (result != 0) { printf("soap err,errcode = %d/n",result); } else { printf("%d+%d=%d/n",sum ); } return 0; } int add(const char* server,int *sum) { struct soap add_soap; int result = 0; soap_init(&add_soap); soap_call_ns__add( &add_soap,server,"",sum ); if(add_soap.error) { printf("soap error:%d,%s/n",add_soap.error,*soap_faultcode(&add_soap),*soap_faultstring(&add_soap) ); result = add_soap.error; } soap_end(&add_soap); soap_done(&add_soap); return result; } ??

(输出:1+2=3)

2、客户端程序既可以新建一个新的win32控制台程序,将刚才生成的nsmap,soapClient.h等文件加入工程,编译既可。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读