VS2010使用c++、gSOAP创建的WebService 图文教程

环境

操作系统:Windows 7
gsoap版本:2.8.32
C++编译器/开发环境:Visual Studio 2010

gSOAP是什么

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

下载gSOAP工具包

http://120.52.73.49/jaist.dl.sourceforge.NET/project/gsoap2/gSOAP/gsoap_2.8.32.zip

gSOAP Toolkit
解压后把下面两个文件复制到“C:\Windows”目录下,或者添加环境变量,这 样就可以在任何位置执行命令:

soapcpp2.exe

wsdl2h.exe

一、编写一个头文件

文件名:itoa.h

  1. //gsoap ns service name: itoa
  2. //gsoap ns service namespace: http://localhost/itoa.wsdl
  3. //gsoap ns service location: http://localhost
  4. //gsoap ns service executable: itoa.cgi
  5. //gsoap ns service encoding: encoded
  6. //gsoap ns schema namespace: urn:itoa
  7. int ns__itoa(int i, char **a);

二、生成wsdl和服务端代码

打开CMD命令行,切换目录到“itoa.h”文件所在目录,执行命令:

  1. soapcpp2 -S -I C:\gSOAP\gsoap-2.8\gsoap\import itoa.h


执行完成后,会在文件夹下面生成以下文件:

测试直接使用“soapcpp2 -S itoa.h”也是可以的;

三、创建项目

1、打开VS2010,文件》新建》项目

2、左侧模板中选择Visual c++,右侧选择 Win32 控制台应用程序,输入项目名称,选择保存位置,勾选“为解决方案创建目录”,确定

3、下一步

4、取消“预编译头”的选中状态,完成

四、配置编译

1、打开项目文件目录

2、将第二步生成的代码复制到项目目录下

3、添加文件到项目

4、选择要添加到项目的文件

这里没有列全,有几个文件(stdsoap2.h,stdsoap2.cpp)是需要从gSOAP的源码目录复制过来的

注意:并不是要把所有文件都添加到项目里!

5、替换“itoaServer.cpp”文件的内容,使用以下代码:

  1. // itoaServer.cpp : 定义控制台应用程序的入口点。
  2. //
  3. #include "soapH.h"
  4. #include <windows.h>
  5. #include "itoa.nsmap"
  6. #define BACKLOG (100)    /* Max. request backlog */
  7. DWORD WINAPI process_request(LPVOID*);
  8. int http_get(struct soap * soap);
  9. int main(int argc, char **argv) {
  10. struct soap soap;
  11. struct soap *tsoap;
  12. const char* fmt = "accepts socket %d connection from IP %d.%d.%d.%d\n";
  13. soap_init(&soap);
  14. if ( argc < 2 ) {
  15. soap_serve(&soap);
  16. soap_destroy(&soap);
  17. soap_end(&soap);
  18. }
  19. else {
  20. soap.send_timeout = 60;
  21. soap.recv_timeout = 60;
  22. soap.accept_timeout = 3600;
  23. soap.max_keep_alive = 100;
  24. soap.fget = http_get;
  25. DWORD tid;
  26. HANDLE hThread;
  27. int port = atoi(argv[1]); // first command-line arg is port
  28. SOAP_SOCKET m, s;
  29. m = soap_bind(&soap, NULL, port, BACKLOG);
  30. if ( !soap_valid_socket(m) ) exit(1);
  31. printf("Socket connection successful %d\n", m);
  32. for ( ; ; ) {
  33. s = soap_accept(&soap);
  34. if ( !soap_valid_socket(s) ) {
  35. if ( soap.errnum ) {
  36. soap_print_fault(&soap, stderr);
  37. exit(1);
  38. }
  39. printf("server timed out\n");
  40. break;
  41. }
  42. printf(fmt, s, (soap.ip>>24)&0xFF, (soap.ip>>16)&0xFF, (soap.ip>>8)&0xFF, soap.ip&0xFF);
  43. tsoap = soap_copy(&soap); // make a safe copy
  44. if ( !tsoap ) break;
  45. hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)process_request, tsoap, 0, &tid);
  46. if ( hThread == NULL ) {
  47. printf("can not create a thread for SOAP request processing.\n");
  48. exit(-1);
  49. }
  50. }
  51. }
  52. soap_done(&soap);
  53. return 0;
  54. }
  55. DWORD WINAPI process_request(LPVOID* soap) {
  56. soap_serve((struct soap*)soap);
  57. soap_destroy((struct soap*)soap);
  58. soap_end((struct soap*)soap);
  59. soap_done((struct soap*)soap);
  60. free(soap);
  61. return 0;
  62. }
  63. // 服务消息的实现代码
  64. int ns__itoa(struct soap *soap, int i, char **a)
  65. {
  66. *a = (char*)soap_malloc(soap, 11);
  67. sprintf(*a, "%d", i);
  68. return SOAP_OK;
  69. }
  70. int http_get(struct soap * soap) {
  71. FILE *fd = NULL;
  72. printf("call http_get.\n");
  73. char *s = strchr(soap->path, '?');
  74. if ( !s || strcmp(s, "?wsdl") ) return SOAP_GET_METHOD;
  75. fd = fopen("itoa.wsdl", "rb");
  76. if ( !fd ) return 404;
  77. soap->http_content = "text/xml";
  78. soap_response(soap, SOAP_FILE);
  79. for ( ; ; ) {
  80. size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
  81. if ( !r ) break;
  82. if ( soap_send_raw(soap, soap->tmpbuf, r) ) break;
  83. }
  84. fclose(fd);
  85. soap_end_send(soap);
  86. return SOAP_OK;
  87. }

6、编译生成,在项目名称上单击鼠标右键,选择重新生成

选择重新生成的好处是避免之前的生成错误影响本次生成的结果

7、生成成功后,从项目目录下将“itoa.wsdl”文件复制到输出目录

五、启动WebService并测试

1、打开CMD命令提示符

2、切换目录到生成输入目录

3、执行命令:itoaServer.exe 8087

后面的端口是可以自己定义的,你想用什么就输入什么,只要是未占用的,不是其它协议/服务常用的;

4、允许访问

5、打开浏览器,输入你的IP:端口号/itoa?wsdl 访问看看吧,正常的话应该显示“itoa.wsdl”文件的内容

2016-05-29更新

1、更新文件:itoa.h,添加了一个函数

  1. //gsoap ns service name: itoa
  2. //gsoap ns service protocol: SOAP
  3. //gsoap ns service style: rpc
  4. //gsoap ns service namespace: http://localhost:8087/itoa?wsdl
  5. //gsoap ns service location: http://localhost:8087
  6. //gsoap ns service encoding: encoded
  7. //gsoap ns schema namespace: urn:itoa
  8. int ns__itoa(int i, char **a);
  9. int ns__add(double a, double b, double& result);

2、更新文件:itoaServer.cpp,加入代码:

  1. //server端的实现函数与itoa.h中声明的函数相同,但是多了一个当前的soap连接的参数
  2. int ns__add(struct soap *soap, double a, double b, double& result)
  3. {
  4. result = a + b;
  5. return 0;
  6. }

3、ns与ns2的区别

目前只是发现如果头文件件中的函数名使用ns2开头的话(例如:ns2_itoa),那么生成的WSDL文件名就是“ns2.wsdl”,时间有限,还没有深入去研究;另外在官方用户手册中也会看到“//gsoap ns2 service”这样的,也没有尝试;

结束语

别人如果想访问你的WebService,必须能够拿到你的 wsdl 文件(本例中为:itoa.wsdl)才行,还有就是你的WebService运行的服务器IP及使用的端口。

这里只讲了如何用c++,gSOAP开发一个WebService供别人调用,以后再讲讲如何调用的吧。

相关源码下载:http://download.csdn.net/detail/testcs_dn/9528394

下一篇:VS2010使用c++、gSOAP调用WebService 图文教程

参考:

http://www.genivia.com/products.html

http://www.genivia.com/doc/soapdoc2.html

http://www.cppblog.com/qiujian5628/archive/2008/06/19/54019.html

http://www.cppblog.com/qiujian5628/archive/2008/09/16/61945.html

http://blog.csdn.net/testcs_dn/article/details/51463367

http://blog.csdn.net/testcs_dn/article/details/51526051

VS2010使用c++、gSOAP创建WebService 图文教程的更多相关文章

  1. gsoap创建webservice服务简单教程

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] WebServicesoapgsoap 使用gsoap创建webservice服务 下载gsop 准备待导出的服务接口定义文件比 ...

  2. sqlserver如何创建镜像图文教程(转)

    由于工作中需要做SQL的镜像异地备份,以前都没有研究过,百度了一个文章记录下,方便以后查询 转载地址:http://jingyan.baidu.com/article/d5c4b52b20843fda ...

  3. Win7(32/64)VS2010配置编译GDAL环境(图文教程+亲测可用!)

    最近的一个VS2010的项目中用到了GDAL,关于GDAL这个库的说明与赞美,这里就不赘述了,下面是在VS2010中配置GDAL的详细过程. 系统说明 Win7(32位/64位),VS2010,GDA ...

  4. 【转】vs2010下创建webservice

    题记:学了六个月java一直想做java,没想到进了.NET项目组,还是VB2012,还有WebService,压力山大,这篇纯粹看看多图的效果,版主不要怪罪. Visual Studio 2010默 ...

  5. 基于MAVEN使用IDEA创建dubbo入门项目图文教程

    花了很长时间没有找到一个很详细的图文教程来学习dubbo入门框架,故记录下来. 一: 项目工程目录 简单介绍项目目录结构: 二: 创建父工程 具体操作步骤: 1,打开IDEA,按下面步骤来 File- ...

  6. idea创建springcloud项目图文教程(EurekaServer注册中心)

    http://blog.csdn.net/hcmony/article/details/77854999 idea创建springcloud项目图文教程(EurekaServer注册中心)(六) 1, ...

  7. Altium 中异形焊盘异形封装的创建图文教程

    Altium 中异形焊盘异形封装的创建图文教程 一般不规则的焊盘被称为异型焊盘,典型的有金手指.大型的器件焊盘或者板子上需要添加特殊形状的铜箔(可以制作一个特殊封装代替). 如图27所示,此处我们以一 ...

  8. vs2010下创建webservice ----第一天(建立项目,以及不连数据库进行加减乘除)

    Visual Studio 2010默认采用的框架为.NET Framework4,在这个框架中已找不到直接创建WebService的模板方式了.但VS2010可以创建WebService是毋庸置疑的 ...

  9. Win 2003 创建 IP 安全策略来屏蔽端口的图文教程

    (本文用示例的方法讲解 IP 安全策略的设置方法,具体的设置还是要根据个人实际的需要来设置.另外 Windows Server 2008 与此类似.千一网络编辑注) IP安全性(Internet Pr ...

随机推荐

  1. Android菜鸟的成长笔记(18)——绑定本地Service并与之通信

    在上一篇中介绍了Service与Activity的区别及Service两种启动方式中的第一种启动方式startService(). 我们会发现用startService().stopService() ...

  2. 手动安装配置Android Studio

    官网下载Android Studio安装包后安装启动Android Studio,程序提示安装SDK,因为代理/FQ的原因,安装component失败,错误如下: Preparing "In ...

  3. Mac下cocos2dx3.1用Cocos IDE写的Lua binding篇01

    本人Lua新手,写着玩玩. 新建一个模版project. 一.改动main.lua require "Cocos2d" require "Cocos2dConstants ...

  4. OpenMP中的同步和互斥

    在多线程编程中必须考虑到不同的线程对同一个变量进行读写访问引起的数据竞争问题.如果线程间没有互斥机制,则不同线程对同一变量的访问顺序是不确定的,有可能导致错误的执行结果. OpenMP中有两种不同类型 ...

  5. WPF中3D旋转的实现

    原文:WPF中3D旋转的实现 关于3D旋转的原理,请看Daniel Lehenbauer的文章 <Rotating the Camera with the Mouse> http://vi ...

  6. WPF 3D模型的一个扩展方法

    原文:WPF 3D模型的一个扩展方法 在WPF 3D中,我们常常需要改变一个ModelVisual3D对象的颜色. 先说说ModelVisual3D,本质上3D模型都是由一个个的三角形构成的,并且经过 ...

  7. Go程序开发---Go环境配置:CentOS6.5+Go1.8标准包安装

    1.Go安装 1.1Go的三种安装方式 Go有多种安装方式,可以选择自己习惯的方式进行,这里介绍三种安装方式: 1)Go源码安装 2)Go标准包安装 3)第三方工具安装 这里主要介绍下Go标准包在Ce ...

  8. python下载图片(3)

    # -*- coding: utf-8 -*-"""some function by metaphy,2007-04-03,copyleftversion 0.2&quo ...

  9. Qt Installer Framework 3.0.1 Released(功能比较强)

    We are happy to announce the release of Qt IFW 3.0.1. 3.0.1 is fully compatible with 2.0.5, which me ...

  10. ArcGIS Runtime SDK for WPF 初始化

    安装包 管理nuget包 Esri.ArcGISRuntime.WPF 也许还需要 Esri.ArcGISRuntime.Hydrography Esri.ArcGISRuntime.LocalSer ...