gSOAP使用

gSOAP使用

Kagula

环境

 [1]VS2008+SP1

 [2]WinSP+SP3

 [3] gsoap_2.8.8.zip

正文

以实例形式描述,如何用gSOAP Toolkit实现Web Service功能,本文还捎带了如何用C#访问用gSoap with c++写的Web Service服务。

我习惯上把所有的SDK放在自己计算机的E:\SDK路径下,你可以指定其它路径。

 

准备工作

[1]从参考资料中下载gsoap_2.8.8.zip并解压到“E:\SDK\gsoap-2.8

[2]E:\SDK\gsoap-2.8\gsoap\bin\win32”下有wsdl2.h.exesoapcpp2.exe,你也可以自己编译出这两个工具。下面的步骤[3][4]可选。

[3]打开“E:\SDK\gsoap-2.8\gsoap\VisualStudio2005\wsdl2h\wsdl2h.sln”编译出

E:\SDK\gsoap-2.8\gsoap\VisualStudio2005\wsdl2h\release\wsdl2h.exe

[4]打开“E:\SDK\gsoap-2.8\gsoap\VisualStudio2005\soapcpp2\soapcpp2.sln”文件无法编译通过,参考资料[2]编译通过。

[5] VS2008中加入头文件搜索路径“E:\SDK\gsoap-2.8\gsoap

 

第一个Web Service服务端(C++)

[1]新建Win32控制台项目“MyFirstWS”。定义头文件“MyInterface.h”,输入你要暴露给WS客户端的方法声明,内容如下

int   ns__sqrt(double a, double &result);

[2]转到源文件所在的目录,运行命令“soapcpp2  -S  MyInterface.h”生成存根文件

将新生成的C++的源码文件加入到你的工程项目中,soapServerLib.cpp文件不用加。你需要修改自动生成的ns.wsdl文件,因为里面的Web Service侦听端口默认为80,但是我们一般不使用默认侦听端口。

[3]加入“E:\SDK\gsoap-2.8\gsoap”下的“stdsoap2.hstdsoap2.cppdom.cpp”三个源文件到当前项目中。

[4]修改“MyFirstWS.cpp”,源文件内容如下

 

[cpp]  view plain  copy
  1. // MyFirstWS.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. #include "MyInterface.h"  
  7. #include "ns.nsmap"  
  8.   
  9. //我的接口实现  
  10. int ns__sqrt(struct soap *soap, double a, double &result)    
  11. {    
  12.    if (a >= 0)    
  13.    {    
  14.       result = sqrt(a);    
  15.       return SOAP_OK;    
  16.    }    
  17.   
  18.    return soap_sender_fault(soap,   
  19.        "Square root of negative value",   
  20.        "I can only compute the square root of a non-negative value");   
  21. }   
  22.   
  23. //返回接口描述,否则在为C#代码添加服务引用时,找不到这个接口  
  24. int http_get(struct soap   *soap)   
  25. {   
  26.     std::string fileName = "ns.wsdl";  
  27.       
  28.     if(strstr(soap->msgbuf,"clientaccesspolicy.xml")!=NULL){  
  29.         fileName = "clientaccesspolicy.xml";  
  30.       
  31.     }//红色乃添加的代码  
  32.     FILE*fd = NULL;  
  33.     fd = fopen(fileName.c_str(), "rb"); //open WSDL file to copy  
  34.     if (!fd)  
  35.     {  
  36.         return 404; //return HTTP not found error  
  37.     }  
  38.     soap->http_content = "text/xml";  //HTTP header with text /xml content  
  39.     soap_response(soap,SOAP_FILE);  
  40.     for(;;)  
  41.     {  
  42.         size_t r = fread(soap->tmpbuf,1, sizeof(soap->tmpbuf), fd);  
  43.         if (!r)  
  44.         {  
  45.                 break;  
  46.         }  
  47.         if (soap_send_raw(soap, soap->tmpbuf, r))  
  48.         {  
  49.                 break//cannot send, but little we can do about that  
  50.         }  
  51.     }  
  52.     fclose(fd);  
  53.     soap_end_send(soap);  
  54.     return SOAP_OK;   
  55. }  
  56.   
  57. int _tmain(int argc, _TCHAR* argv[])  
  58. {  
  59.     int m, s; /* master and slave sockets */  
  60.     struct soap sqrt_soap;  
  61.     soap_init(&sqrt_soap);  
  62.   
  63.     //添加,返回接口描述(WSDL)的功能,  
  64.     //否则其它语言在建立Web Service客户端的时候,无法自动生成代码  
  65.     sqrt_soap.fget = http_get;      
  66.   
  67.     //服务端侦听端口设为8080,注意ns.wsdl文件内容要做相应修改  
  68.     m = soap_bind(&sqrt_soap, NULL, 8080, 100);  
  69.     if (m < 0)  
  70.     {  
  71.         soap_print_fault(&sqrt_soap, stderr);  
  72.         exit(-1);  
  73.     }  
  74.       
  75.     fprintf(stderr, "Socket connection successful: master socket = %d\n", m);  
  76.     for ( ; ; )  
  77.     {   
  78.         s = soap_accept(&sqrt_soap);   
  79.         if (s < 0)  
  80.         {   
  81.             soap_print_fault(&sqrt_soap, stderr);  
  82.             exit(-1);  
  83.         }  
  84.         fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);  
  85.           
  86.         soap_serve(&sqrt_soap);  
  87.         soap_end(&sqrt_soap);  
  88.     }  
  89.   
  90.     return 0;  
  91. }  


[5]如果链接的时候找不到soap的析构函数,你需要手动编译stdsoap2.cpp文件(即右键单击文件名,在弹出菜单上选择编译即可)

现在服务端程序可以跑起来了!

 

第一个WebService客户端(C++语言)

[1]新建C++Console工程

[2]在命令行控制台中转到当前C++项目目录下

根据http://localhost:8080/网址打印出的WSDL信息产生MyInterface.h头文件

wsdl2h  -o  MyInterface.h  http://localhost:8080/

[3]根据“MyInterface.h”头文件生成存根文件

soapcpp2  -C  -IE:\SDK\gsoap-2.8\gsoap\import  MyInterface.h”,“-C”参数指定只生成客户端存根文件,默认服务端和客户端存根文件都生成。“-I”参数指定stlvector.h文件的搜索路径。“E:\SDK\gsoap-2.8”是我gsoap  Toolkit的存放路径。在项目中添加新生成的源文件,soapClientLib.cpp文件不用添加。

[4]在项目中添加E:\SDK\gsoap-2.8\gsoap目录下的stdsoap2.hstdsoap2.cppdom.cpp等三个文件。

[5]修改项目默认的cpp文件,源码清单如下

 

[cpp]  view plain  copy
  1. // MyFirstWSClient.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5.   
  6. //服务端提供的功能可以查看下面的头文件内容  
  7. //如果服务端的URL地址或侦听端口改变,需要修改下面这个头文件  
  8. #include "soapServiceProxy.h"  
  9.   
  10. //下面这个头文件是必须的,否则stdsoap2.obj连接的时候会出错  
  11. #include "Service.nsmap"  
  12.   
  13. int _tmain(int argc, _TCHAR* argv[])  
  14. {  
  15.     Service srv;  
  16.   
  17.     double dR;  
  18.     {  
  19.         _ns2__sqrt         call;      //形参表  
  20.         _ns2__sqrtResponse response;  //返回调用结果  
  21.         call.a = 4.0;  
  22.         int nR = srv.__ns1__sqrt(&call,&response);//调用sqrt函数  
  23.         if( nR == SOAP_OK)  
  24.         {  
  25.             dR = response.result;  
  26.             printf("成功返回,sqrt(4)=%f\n",response.result);  
  27.         } else  
  28.         {  
  29.             printf("请检查网络连接!");  
  30.         }  
  31.     }  
  32.   
  33.     return 0;  
  34. }  


现在你的程序可以跑起来了

 

第一个Web Service客户端(C#语言)

[1]新建C#Console工程

[2]在新的工程里添加”Service Reference”,在出现的窗口里把你Web Service服务端的URL地址复制过去,Visual  Studio 2008会自动发现Web Service接口,并为这个服务的接口建立相应的代码

[3]你可能需要修改app.config文件,修改Web Service服务的地址及侦听端口。

[4]修改Program.cs源文件,源码如下

 

[csharp]  view plain  copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5.   
  6. using WSClient.ServiceReference1;  
  7.   
  8. namespace WSClient  
  9. {  
  10.     class Program  
  11.     {  
  12.         static void Main(string[] args)  
  13.         {  
  14.             try  
  15.             {  
  16.                 ServicePortTypeClient proxy = new ServicePortTypeClient();  
  17.                 double dR = proxy.sqrt(4);  
  18.                 Console.WriteLine("sqrt(..)=" + dR);  
  19.             }  
  20.             catch (Exception e)  
  21.             {  
  22.                 Console.WriteLine(e.Message);  
  23.             }  
  24.         }  
  25.     }  
  26. }  


现在可以跑了!

参考资料(网站)

[1]gSOAP Toolkit》官网

http://www.cs.fsu.edu/~engelen/soap.html

[2]gSoap入门之一__下载及编译gsoap两大法宝》

http://blog.csdn.net/hslinux/article/details/5888352

[3]Silverlight跨域调用gSoap/Java web service以及wsdl文件的修改》http://www.cnblogs.com/MonkChen/archive/2012/01/11/2318672.html


转载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用gSOAP生成Onvif服务端,你需要按照以下步骤操作: 1. 下载和安装gSOAP:首先,你需要从gSOAP官方网站(https://www.genivia.com/downloads.html)下载并安装gSOAP工具包。根据你的操作系统选择合适的版本,并按照官方文档进行安装步骤。 2. 定义服务接口:使用gSOAP的接口定义语言(IDL)来定义你的Onvif服务接口。在IDL文件中,你可以定义服务的方法、参数和返回类型等。确保按照Onvif规范来定义你的服务接口。 3. 生成代码:使用gSOAP提供的工具来生成C/C++代码。你需要使用命令行工具 `soapcpp2` 并提供IDL文件作为输入。执行命令后,gSOAP将生成相应的服务端和客户端代码文件。 4. 实现服务逻辑:根据生成的代码,你需要实现Onvif服务的具体逻辑。这包括处理接收到的请求、执行相应的操作并构建响应。 5. 编译和构建:编译你的服务端代码,并链接所需的库文件。确保按照gSOAP文档提供的指导进行编译和构建步骤。 6. 运行服务端:运行生成的服务端程序,并确保它能够监听和处理来自客户端的请求。 请注意,这只是一个概述性的步骤,具体的实施可能因个人需求和环境而异。在实际开发中,你还需要了解Onvif协议规范和gSOAP工具的详细用法,并根据实际情况进行适当的配置和定制。 希望这些信息对你有所帮助!如果你有进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值