gsoap中文文档

本文由zhengsir12贡献 doc1。

gsoap 中文文档 8.1.2 关于命名空间 函数 ns1__getQuote(上节提到的)中,使用了 ns1__作为远程方法的命名空间。

使用命名 空间是为了防止远程方法名冲突,比方多个服务中使用同一个远程方法名的情况。

 命名空间前缀及命名空间名称同时也被用来验证 SOAP 信息的内容有效性。

存根例程通过 命名空间表中的信息来验证服务返回信息。

 命名空间表在运行时被取出用于解析命名空间绑 定,反序列化数据结构,解码并验证服务返回信息。

命名空间表不应该包含在 gSOAP 预编 译器所需输入的头文件中。

在 18.2 节中将会对命名空间表做详细介绍。

 Delayed Stock Quote 服务客户端的命名空间表如下: struct Namespace namespaces[] = { // {"命名前缀", "空间名称"} {"SOAP-ENV", "http://schemas.xmlsoap.org/soap/envelope/"}, // 必须是第一行 {"SOAP-ENC", "http://schemas.xmlsoap.org/soap/encoding/"}, // 必须是第二行 {"xsi", "http://www.w3.org/2001/XMLSchema-instance"}, // 必须是第三行 {"xsd", "http://www.w3.org/2001/XMLSchema"}, // 2001 XML 大纲 {"ns1", "urn:xmethods-delayed-quotes"}, // 通过服务描述获取 {NULL, NULL} // 结束 }; 第一行命名空间是 SOAP1.1 协议默认命名空间。

事实上,命名空间表就是用来让程序员可 以规定 SOAP 编码方式,能够用包含命名空间的命名空间前缀来满足指定 SOAP 服务的命 名空间需求的。

举例来说,使用前面命名空间表中定义的命名空间前缀 ns1,存根例程就可 以对 getQuote 方法的请求进行编码。

这个过程由 gSOAP 预编译器通过在 getQuote.h 文件中 定义的包含前缀 ns1 的 ns1__getQuote 函数自动完成。

通常,如果要在远程方法名,结构名, 类名,字段名等结构或类中使用命名空间前缀,就必须在命名空间表中进行定义。

 命名空间表将会被存根例程封装,并按下面的形式输出: …… …… 这个命名空间绑定将被 SOAP 服务用来验证 SOAP 请求。

 8.1.3 例子 使用命名空间前缀可以解决在不同的服务中使用相同名称的远程方法的问题,看下面的例 子: // Contents of file "getQuote.h": int ns1__getQuote(char *symbol, float &Result); int ns2__getQuote(char *ticker, char *&quote); 这个例子允许客户端程序使用不同的命名空间以便连接到不同的服务程序执行其中的远程 方法。

 命名空间前缀也可以用在类声明中使用, XML 大纲中区分同名但不同命名空间的 SOAP 在 值。

例如: class e__Address // an electronic address { char *email; char *url; }; class s__Address // a street address { char *street; int number; char *city; }; 在生成的序列化函数中,使用 e__Address 的一个实例来表示 e 命名空间前缀的一个地址元 素类型。

 <e:Address xsi:type="e:Address"> me@home www.me.com </e:Address> 用 s__Address 的一个实例来表示 s 命名空间前缀的一个地址元素类型。

Technology Drive <number xsi:type="int">5</number> <city xsi:type="string">Softcity</city> 客户端程序的命名空间表必须有 e 和 s 的数据类型定义: struct Namespace namespaces[] = { …… {"e", "http://www.me.com/schemas/electronic-address"}, {"s", "http://www.me.com/schemas/street-address"}, …… 命名空间表必须作为客户端程序的一部分,使客户端程序在运行时可以对数据进行序列化 及反序列化。

 8.1.4 如何建立客户端程序代理类 用于 C++客户端程序的代理类信息是由 gSOAP 预编译器自动创建的。

为了说明代理类的 生成过程,我们在 getQuote.h 头文件中加入一些信息,以便 gSOAP 预编译器可以生成代理 类。

这些信息就类似于 WSDL 解析器自动生成的头文件中就已经包含的信息。

 //"getQuote.h"的内容: //gsoap ns1 service name: Quote //gsoap ns1 service location: http://services.xmethods.net/soap //gsoap ns1 service namespace: urn:xmethods-delayed-quotes //gsoap ns1 service style: rpc //gsoap ns1 service encoding: encoded //gsoap ns1 service method-action: getQuote "" int ns1__getQuote(char *symbol, float &Result); 前三行指令用于定义代理类的名称,服务地址,命名空间。

第四行、第五行指令定义了使 用 SOAP RPC 编码方式。

最后一行定义了可选的 SOAPAction。

当需要 SOAPAction 时,这 行 信 息 将 提 供 给 每 个 远 程 方 法 。

 使 用 soapcpp2 对 该 头 文 件 进 行 编 译 后 , 将 会 产 生 soapQuoteProxy.h 文件。

它包含下面的内容: #include "soapH.h" class Quote { public: struct soap *soap; const char *endpoint; Quote() { soap = soap_new(); endpoint = "http://services.xmethods.net/soap"; };  ̄Quote() { if (soap) { soap_destroy(soap); soap_end(soap); soap_done(soap); free((void*)soap); }}; int getQuote(char *symbol, float &Result) { return soap ? soap_call_ns1__getQuote(soap, endpoint, "", symbol, Result) : SOAP_EOM; }; }; 为了能够在运行时刻对 gSOAP 环境变量及命名空间进行定制,上述两个变量被定义程全 局变量。

 生成的代理类可以同命名空间表一起包含在客户端程序中,请看下面的例子: #include "soapQuoteProxy.h" // 获得代理类 #include "Quote.nsmap" // 获得命名空间绑定 int main() { Quote q; float r; if (q.ns1__getQuote("IBM", r) == SOAP_OK) std::cout << r << std::endl; else soap_print_fault(q.soap, stderr); return 0; } Quote 构造函数定义并初始化了一个 gSOAP 运行环境实例。

所有的 HTTP 及 SOAP/XML 进程都被隐藏在后台自动执行。

 如果你需要多个命名空间表或要联合多个客户端, 你可以在执行 soapcpp2 时添加参数-n 及 -p 来生成命名空间表以防止冲突。

详细信息请看 9.1 及 18.33 节。

同时,你可以使用 C++代 码命名空间来创建一个命名空间限制的代理类,详细信息请看 18.32 节。

 8.1.5 XSD 类型编码 许多 SOAP 服务需要在 SOAP 负载中使用 XML 编码。

 gSOAP 预编译器中使用的默认编 在 码为 SOAP RPC 编码。

然而,使用 XSD 类型编码可以改善互操作性。

XSD 类型在头文件中 用 typedef 定义。

举个例子,下面的定义将 C/C++类型转换为 XSD 类型: // Contents of header file: …… typedef char *xsd__string; // encode xsd__string value as the xsd:string schema type typedef char *xsd__anyURI; // encode xsd__anyURI value as the xsd:anyURI schema type typedef float xsd__float; // encode xsd__float value as the xsd:float schema type typedef long xsd__int; // encode xsd__int value as the xsd:int schema type typedef bool xsd__boolean; // encode xsd__boolean value as the xsd:boolean schema type typedef unsigned long long xsd__positiveInteger; // encode xsd__positiveInteger value as the xsd:positiveInteger schema type …… 这些简单的声明告诉 gSOAP 预编译器当远程方法参数中使用上述定义的类型时,就把相 关的 C++类型转当作内建的 XSD 类型进行编码、解码。

同时,使用 typedef 不需要使用内建 C++类型的客户端或服务端程序更改现有代码(但只是当参数为简单的 C++类型时,请参看 11.2.2 节来使用 XSD 类型表示组合的数据类型) 。

合集下载

CC++ SOAP工具包 gSOAP

CC++ SOAP工具包 gSOAP

C/C++ SOAP工具包 gSOAPgSOAP一种跨平台的C和C++软件开发工具包。

生成C/C++的RPC代码,XML数据绑定,对SOAP Web服务和其他应用形成高效的具体架构解析器,它们都受益于一个XML接口。

这个工具包提供了一个全面和透明的XML数据绑定解决方案,Autocoding节省大量开发时间来执行SOAP/XML Web服务中的C/C++。

此外,使用XML数据绑定大大简化了XML自动映射。

应用开发人员不再需要调整应用程序逻辑的具体库和XML为中心的数据,如交涉DOM。

功能和特点可移植性:gSOAP支持大多数平台,包括嵌入式系统和小系统(例如嵌入式Symbian,Palm)。

可移植性测试Windows(98,XP,Vista),Linux,Unix 系统,Mac OS X,Solaris,HP-UX,AIX,FreeBSD,TRU64,Irix,QNX,VxWorks。

稳定性:该软件已经成熟。

自2001年以来经过几年的发展和试验。

许多工业项目和产品都在使用该软件。

广泛的用户群:自2003年以来超过150000次下载,成千上万许可证/支持协议的公司,其中包括一些财富100强企业。

所有功能于一身的软件包:独立第三方工具和库确保可靠的运行执行。

开源:可选择自由和商业许可。

C和C++的支持:支持纯粹的ANSI C和混合的C/C++应用开发。

综合XML数据绑定:gSOAP是唯一的SOAP/XML工具包,支持一个纯粹的本地的C/C++数据绑定到XML。

该工具包是以自动序列指针为基础的数据结构。

行业标准协议:SOAP 1.1/1.2 WSDL 1.1,v2和UDDI 。

支持XML架构原始XSD结构类型等等。

传输:HTTP/S, TCP, UDP, MIME (SwA), DIME (streaming), MTOM (streaming), HTTP1.0/1.1, IPv4, IPv6, RSS, XML-RPC, WS-Addressing, WS-Enumeration等安全:HTTPS和WS安全性:认证令牌,数字签名。

linux gsoap 用法

linux gsoap 用法

linux gsoap 用法gSOAP 是一个用于开发Web 服务和SOAP 客户端/服务器应用程序的开源工具包。

它可以让开发者通过创建C/C++ 代码来构建基于SOAP 的Web服务和客户端。

在Linux 上使用gSOAP,你需要遵循以下步骤:1. 下载gSOAP 工具包:- 前往gSOAP 官方网站("gSOAP Toolkit" 下载最新版本的gSOAP 工具包。

- 解压下载的压缩包。

2. 编写服务定义文件(.wsdl 文件):- 使用你喜欢的文本编辑器,编写一个包含要实现的Web 服务的定义的 .wsdl 文件。

这个文件描述了服务的数据类型、操作和消息。

3. 生成源代码:- 打开终端,进入gSOAP 工具包的解压目录。

- 运行命令`./soapcpp2 -C -I path_to_gsoap_toolkit your_service.wsdl`,其中`path_to_gsoap_toolkit` 是gSOAP 工具包的路径,`your_service.wsdl` 是你编写的 .wsdl 文件的路径。

- 这将使用gSOAP 工具根据你的 .wsdl 文件生成C/C++ 源代码。

4. 实现Web 服务:- 在生成的源代码中,找到`your_serviceService.cpp` 文件。

- 在这个文件中,你可以实现Web 服务的操作。

你需要编辑操作的函数实现,处理接收到的请求,并返回响应。

5. 编译生成的源代码:- 在终端中,使用适当的编译器(如gcc)编译生成的源代码。

- 运行命令`gcc -o your_service your_serviceService.cpp soapC.cpp soapServer.cpp stdsoap2.cpp -lgsoap++`,其中`your_service` 是生成的可执行文件名。

- 如果编译成功,将生成一个可执行文件。

6. 启动Web 服务:- 运行命令`./your_service` 来启动Web 服务。

gsoap编译

gsoap编译

gsoap编译GSOAP是一款开源的C/C++软件,是一种基于SOAP的Web服务开发工具。

它可以让用户通过简单的代码,实现创建SOAP消息、IPC、Web服务和Web应用程序等功能。

用户可以使用gSOAP开发部署服务器端和客户端的应用程序。

本文将向您介绍gSOAP编译,并告诉您如何使用该工具。

第一步:下载gSOAP软件包在编译gSOAP之前,我们需要从官方网站下载gSOAP软件包。

该网站提供了多种版本的gSOAP,您可以根据自己的需要选择不同的版本。

建议您下载最新版本的gSOAP。

第二步:解压缩gSOAP软件包下载完成后,将gSOAP 软件包解压缩到您的计算机上。

如果您使用的是Linux和Unix操作系统,可以利用tar命令实现解压缩操作。

例如:$ tar xzf soapsource.tgz第三步:配置gSOAP 进入gSOAP软件包目录。

在该目录中会看到一个名为configure的文件。

Connectors目录中有可选的连接器。

可以使用的连接器有:Stdio连接器SSL连接器HTTPS连接器zlib连接器接下来,我们通过执行configure脚本来生成Makefile,执行以下命令: $ ./configure如果您需要配置gSOAP的全部选项,可以使用以下命令: $ ./configure --help第四步:编译gSOAP 在配置完gSOAP后,我们可以进入soapcpp2目录并使用make命令进行编译。

以下是命令:$ cd gsoap-<version>/gsoap$ make这会生成一个名为soapcpp2的可执行文件。

我们可以使用该文件来生成SOAP客户端和服务器端的代码。

第五步:测试gSOAP 完成编译后,您可以使用gSOAP 测试Web服务和Web应用程序。

您可以使用以下命令测试gSOAP:$ ./soapcpp2该命令将告诉gSOAP要生成客户端和服务器端代码的相关选项。

gSOAP学习笔记总结版

gSOAP学习笔记总结版

gSOAP学习笔记总结版Struct soap add_soap;Soap_malloc(add_soap, len); // 申请空间,soap_end函数释放>>gsoap传输中文。

我使用utf-8编码格式来支持汉字的传输。

1. 设置gsoap为utf-8传输数据soap_set_mode( &SmsWBS_soap, SOAP_C_UTFSTRING ); //设置编码SmsWBS_soap.mode|=SOAP_C_UTFSTRING;2. 使用下面得函数转换我们的传输内容,即将我们的数据转成UTF-8编码:int conv_charset( const char *dest, const char *src, char *input, size_t ilen, char *output, size_t olen ){int convlen = olen;iconv_t conv = iconv_open( dest, src );if( conv == (iconv_t) -1 )return -1;memset( output, 0, olen );if( iconv( conv, &input, &ilen, &output, &olen ) ){iconv_close(conv);return -1;}iconv_close(conv);return convlen-olen;}例子:conv_charset( "UTF-8", "GBK", "林学任.linxr", strlen("林学任.linxr"), buf_out->name, 100 );>>gsoap中返回字符串1. 下面是一个逆转字符串的函数。

int ns__echo_USCOREreverse( char * buf_in, char ** buf_out );int ns__echo_USCOREreverse( struct soap *add_soap, char *buf_in, char **buf_out ){int i, j, len;printf( "ns__interface: in=[%s]\n", buf_in );len = strlen(buf_in);*buf_out = (char*)soap_malloc( add_soap, len+1 );for( i=len-1, j=0; i>=0; i--, j++ ){(*buf_out)[j] = buf_in[i];}(*buf_out)[j] = 0;return 0;}其中调用soap_malloc申请空间,并且将他赋给返回参数buf_out。

C++中gSOAP的使用详解

C++中gSOAP的使用详解

C++中gSOAP的使⽤详解⽬录SOAP简介gSOAP准备⼯作头⽂件构建客户端应⽤程序⽣成soap源码建⽴客户端项⽬构建服务端应⽤程序⽣成SOAP源码建⽴服务端项⽬打印报⽂SOAP测试项⽬源码总结本⽂主要介绍C++中gSOAP的使⽤⽅法,附带介绍SOAP协议的基础知识,适⽤于第⼀次使⽤gSOAP的开发⼈员。

gSOAP官⽹上的⽰例代码存在⼀些错误,对初次接触的⼈不太友好,本⽂是在官⽅⽰例的基础上进⾏了⼀些补充、改动。

SOAP简介SOAP 是⼀种简单的基于 XML 的协议,它使应⽤程序通过 HTTP 来交换信息,具体内容可以参考教程。

SOAP的本质是通过HTTP协议以XML格式进⾏数据交互,只不过这个XML格式的定义是⼤家公认的。

使⽤SOAP时需注意,SOAP的XML命名空间由于版本的不同可能存在差异(如soapevn、SOAP-ENV),在调⽤SOAP服务前最好确认服务器的XML格式。

gSOAPgSOAP 有商业版、开源版两个版本,开源版使⽤GPLv2开源协议,⽀持多个操作系统,具体内容参考或者。

gSOAP提供了⼀组编译⼯具(可以认为是代码⽣成器)和⼀些库⽂件,简化C/C++语⾔开发web服务或客户端程序的⼯作,开发⼈员可以专注于实现应⽤程序的逻辑:编译⼯具提供了⼀个SOAP/XML 关于C/C++ 语⾔的实现,能够⾃动完成本地C或C++数据类型和XML数据结构之间的转换。

库⽂件提供了SOAP报⽂⽣成、HTTP协议通讯的实现,及相关的配套设施,⽤于最终的SOAP报⽂的⽣成、传输。

本⽂使⽤的库⽂件主要是以下⼏个:stdsoap2.h、stdsoap2.cpp:HTTP协议的实现、最终的SOAP报⽂⽣成,如果是C语⾔则使⽤stdsoap2.h、stdsoap2.ctypemap.dat: wsdl2h⼯具根据wsdl⽂件⽣成头⽂件时需要此⽂件,可以更改项⽬的xml命名空间(后⾯再细说)threads.h:实现⾼性能的多线程服务器需要的⽂件,可以并发处理请求,并且在服务操作变得耗时时不会阻塞其他客户端请求准备⼯作先进⼊官⽹的,然后选择开源版本:将下载的压缩包解压(本⽂使⽤的是gsoap_2.8.117.zip),解压后的⽂件放到⾃⼰习惯的位置(推荐放到C盘)。

gsoap详细实现

gsoap详细实现
同理客户端新建工程,添加相关文件, 新建ClientCalc.cpp,并添加到工程中
gSOAP Windows下的简单实现
注意:客户端指定为8080端口,所以 服务器端只有为8080端口,客户端才 能连上。当然这个端口也可不指定, 直接输入 另外一个很重要一点就是:上述截图 中的五个函数,我们找不到他们的函 数实现部分。因为它的实现部分在服 务器端,这就很好的说明了Web服务。 客户端远程调用服务器端的应用。像 是在本地使用…….
文件路径:
gSOAP Windows下的简单实现
再次运行该命令:
gSOAP Windows下的简单实现
gSOAP Windows下的简单实现
另外:服务器端还有 -T 命令。生成
一个测试例子,以便我们按照仿照例
子写自己的程序。
生成的测试例子:
并将
两个文件拷贝到该目录
下。路径:
稍后将讲到它
的作用
gSOAP Windows下的简单实现
同理:生成客户端
gSOAP Windows下的简单实现
预备工作做足!!! 正式开始写程序:
新建工程:ServerCalc 将相关文件添加到工程中
gSOAP Windows下的简单实现
添加自己的文件: 开始写真正属于自己的东西
gSOAP Windows下的简单实现
调试编译生成可执行文件 回头来看stdsoap2.h和stdsoap2.cpp文 件:
端程序 4.理解WebService的B/S和C/S模

gSOAP Windows下的简单实现
谢谢!
首先将
路径下的
拷贝
到Servercalc目录下
用法:wsdl2h.exe -o 头文件名 WSDL文件 名 或URL (Linux使用wsdl2h)

gsoap中文文档

gsoap中文文档8.1.2 关于命名空间函数ns1__getQuote(上节提到的)中,使用了ns1__作为远程方法的命名空间。

使用命名空间是为了防止远程方法名冲突,比方多个服务中使用同一个远程方法名的情况。

命名空间前缀及命名空间名称同时也被用来验证SOAP信息的内容有效性。

存根例程通过命名空间表中的信息来验证服务返回信息。

命名空间表在运行时被取出用于解析命名空间绑定,反序列化数据结构,解码并验证服务返回信息。

命名空间表不应该包含在gSOAP预编译器所需输入的头文件中。

在18.2节中将会对命名空间表做详细介绍。

Delayed Stock Quote服务客户端的命名空间表如下:struct Namespace namespaces[] ={ // {"命名前缀", "空间名称"}{"SOAP-ENV", "/soap/envelope/"}, // 必须是第一行{"SOAP-ENC", "/soap/encoding/"}, // 必须是第二行{"xsi", "/2001/XMLSchema-instance"}, // 必须是第三行{"xsd", "/2001/XMLSchema"}, // 2001 XML 大纲{"ns1", "urn:xmethods-delayed-quotes"}, // 通过服务描述获取{NULL, NULL} // 结束};第一行命名空间是SOAP1.1协议默认命名空间。

事实上,命名空间表就是用来让程序员可以规定SOAP编码方式,能够用包含命名空间的命名空间前缀来满足指定SOAP服务的命名空间需求的。

举例来说,使用前面命名空间表中定义的命名空间前缀ns1,存根例程就可以对getQuote方法的请求进行编码。

qt gsoap用法

qt gsoap用法Qt gSOAP是一个在Qt框架下使用gSOAP工具包的库。

gSOAP可以通过使用Web服务定义语言(WSDL)生成SOAP服务端和客户端的代码。

在本篇文章中,我将介绍如何在Qt中使用gSOAP库。

首先,要在Qt项目中使用gSOAP,需要先安装gSOAP工具包。

可以在gSOAP官方网站上下载并安装最新版本的gSOAP。

安装完成后,打开Qt项目,将gSOAP的头文件和库文件添加到项目中。

可以通过以下步骤来实现:1. 在Qt Creator中打开项目,选择“项目”菜单,然后选择“属性”选项。

2. 在属性对话框中,选择“构建和运行”选项,然后选择“构建设置”选项卡。

3. 在"C++"部分中,选择“包含路径”选项,点击“添加”按钮,将gSOAP头文件所在的目录添加进来。

4. 在"链接器"部分中,选择“库路径”选项,点击“添加”按钮,将gSOAP库文件所在的目录添加进来。

5. 在"链接器"部分中,选择“附加库”选项,点击“添加”按钮,将gSOAP库文件添加进来。

完成上述步骤后,就可以在Qt项目中使用gSOAP了。

首先,我们需要编写一个WSDL文件来定义我们的SOAP服务。

可以使用gSOAP自带的wsdl2h工具来生成C++头文件。

在终端中运行以下命令:```shellwsdl2h -o HelloWorld.h HelloWorld.wsdl```这将生成一个名为HelloWorld.h的C++头文件,其中包含了定义我们的SOAP 服务所需的类和对象。

接下来,我们可以使用soapcpp2工具来生成主要的gSOAP源文件。

在终端中运行以下命令:```shellsoapcpp2 -i -C HelloWorld.h```这将生成一系列的C++源文件,其中包括用于编写我们的服务代码的skeleton 文件和stub文件。

现在,我们可以在Qt项目中创建一个新的类来实现我们的SOAP服务。

gsoap使用方法及心得(二)

gsoap使用方法及心得(二)1、server端可以编译成CGI方式执行,而并不是绑定到某个端口。

if (argc < 2)// no args: assume this is a CGI application{soap_serve(&soap); // serve request, one thread, CGI stylesoap_destroy(&soap); // dealloc C++ datasoap_end(&soap); // dealloc data and clean up}2、在编译服务器及客户端程序时一开始把add.h生成的文件添加到工程,经常出现问题,需要自己调试。

特别是链接时段,server/client要与其生成的文件相对应,server调用生成的soapserver.cpp,client调用生成的soapclient.cpp文件。

3、多线程方式,在windows下建议用pthread_win32库,这里给出多线程下的例子。

(1) gSOAP需要的头文件://gsoap ns service name: calc//gsoap ns service style: rpc//gsoap ns service encoding: encoded//gsoap ns service namespace://gsoap ns service location://gsoap ns schema namespace: urn:calcint ns__add(double a, double b, double *result);int ns__sub(double a, double b, double *result);int ns__mul(double a, double b, double *result);int ns__div(double a, double b, double *result);int ns__pow(double a, double b, double *result);(2) 多线程服务器关键代码#include "calc.nsmap"#include "soapH.h"//宏与全局变量的定义#define BACKLOG (100)#define MAX_THR (10)#define MAX_QUEUE (1000)pthread_mutex_t queue_cs;//队列锁pthread_cond_t queue_cv;//条件变量SOAP_SOCKET queue[MAX_QUEUE];//数组队列int head =0, tail =0;//队列头队列尾初始化void * process_queue(void *);//线程入口函数int enqueue(SOAP_SOCKET);//入队列函数SOAP_SOCKET dequeue(void);//出队列函数//线程入口函数void * process_queue(void * soap){struct soap * tsoap = (struct soap *)soap;for(;;){tsoap->socket = dequeue();if (!soap_valid_socket(tsoap->socket)){break;}soap_serve(tsoap);soap_destroy(tsoap);soap_end(tsoap);}return NULL;}//入队列操作int enqueue(SOAP_SOCKET sock) {int status = SOAP_OK;int next;pthread_mutex_lock(&queue_cs); next = tail +1;if (next >= MAX_QUEUE){next = 0;}if (next == head){status = SOAP_EOM;}else{queue[tail] =sock;tail = next;}pthread_cond_signal(&queue_cv); pthread_mutex_unlock(&queue_cs); return status;}//出队列操作SOAP_SOCKET dequeue(){SOAP_SOCKET sock;pthread_mutex_lock(&queue_cs);while (head == tail ){pthread_cond_wait(&queue_cv,&queue_cs);}sock = queue[head++];if (head >= MAX_QUEUE){head =0;}pthread_mutex_unlock(&queue_cs);return sock;}//加法的实现int ns__add(struct soap *soap, double a, double b, double *result){*result = a + b;return SOAP_OK;}//减法的实现int ns__sub(struct soap *soap, double a, double b, double *result){*result = a - b;return SOAP_OK;}//乘法的实现int ns__mul(struct soap *soap, double a, double b, double *result){*result = a * b;return SOAP_OK;}//除法的实现int ns__div(struct soap *soap, double a, double b, double *result){if (b){*result = a / b;}else{char *s = (char*)soap_malloc(soap, 1024);sprintf(s, "Can't">/">Can't divide %f by %f", a, b);return soap_sender_fault(soap, "Division by zero", s);}return SOAP_OK;}//乘方的实现int ns__pow(struct soap *soap, double a, double b, double *result){*result = pow(a, b);if (soap_errno == EDOM) //oap_errno 和errorno类似, 但是和widnows兼容{char *s = (char*)soap_malloc(soap, 1024);sprintf(s, "Can't take the power of %f to %f", a, b);sprintf(s, "Can't">/">Can't take power of %f to %f", a, b);return soap_sender_fault(soap, "Power function domain error", s);}return SOAP_OK;}//主函数int main(int argc,char ** argv){struct soap ServerSoap;//初始话运行时环境soap_init(&ServerSoap);//如果没有参数,当作CGI程序处理if (argc <2){//CGI 风格服务请求,单线程soap_serve(&ServerSoap);//清除序列化的类的实例soap_destroy(&ServerSoap);//清除序列化的数据soap_end(&ServerSoap);}else{struct soap * soap_thr[MAX_THR];pthread_t tid[MAX_THR];int i,port = atoi(argv[1]);SOAP_SOCKET m,s;//锁和条件变量初始化pthread_mutex_init(&queue_cs,NULL);pthread_cond_init(&queue_cv,NULL);//绑定服务端口m = soap_bind(&ServerSoap,NULL,port,BACKLOG);//循环直至服务套接字合法while (!soap_valid_socket(m)){fprintf(stderr,"Bind port error! ");m = soap_bind(&ServerSoap,NULL,port,BACKLOG);}fprintf(stderr,"socket connection successful %d ",m);//生成服务线程for(i = 0; i <MAX_THR; i++){soap_thr[i] = soap_copy(&ServerSoap);fprintf(stderr,"Starting thread %d ",i);pthread_create(&tid[i],NULL,(void*(*)(void*))process_queue, (void*)soap_thr[i]);}for(;;){//接受客户端的连接s = soap_accept(&ServerSoap);if (!soap_valid_socket(s)){if (ServerSoap.errnum){soap_print_fault(&ServerSoap,stderr);continue;}else{fprintf(stderr,"Server timed out ");break;}}//客户端的IP地址fprintf(stderr,"Accepted connection from IP= %d.%d.%d.%d socket = %d ",((ServerSoap.ip)>>24)&&0xFF,((ServerSoap.ip)>>16)&0xFF,( (ServerSoap.ip)>>8)&0xFF,(ServerSoap.ip)&0xFF,(ServerSoap.so cket));//请求的套接字进入队列,如果队列已满则循环等待while(enqueue(s) == SOAP_EOM){Sleep(1000);}}//服务结束后的清理工作for(i = 0; i < MAX_THR; i++){while (enqueue(SOAP_INVALID_SOCKET) == SOAP_EOM){Sleep(1000);}}for(i=0; i< MAX_THR; i++){fprintf(stderr,"Waiting for thread %d to terminate ..",i);pthread_join(tid[i],NULL);fprintf(stderr,"terminated ");soap_done(soap_thr[i]);free(soap_thr[i]);}pthread_mutex_destroy(&queue_cs); pthread_cond_destroy(&queue_cv); }//分离运行时的环境soap_done(&ServerSoap);return 0;}。

gsoap使用小结

gsoap使用小结gSoap使用小结分类:开发路上的点点滴滴 2012-03-30 11:33 3564人阅读评论(2) 收藏举报webservicesoapauthorizationnull工具c下载gSoap1.下载完成后直接解压缩,在目录gsoap-2.8\gsoap\bin下面有编译工具,支持多个平台,我们使用的是win32平台的工具wsdl2h.exe 解析WebService的wsdl文件soapcpp2.exe 编译WebService代码2.接下来需要先获得WebService的wsdl文件,访问WebService时,http://XXXX/XXXX.asmx?wsdl这个地址就是需要的wsdl文件,选择查看源文件,然后另存为的方式,获取到wsdl文件,例如:另存为webs.wsdl文件。

3.解析wsdl文件执行wsdl2h.exe -o webs.wsdl命令,就会生成一个webs.h的头文件这里简单说一下参数,主要常用的是-o和-c,-o后面跟的文件名是需要生成的文件名。

-c表示生成纯C的头文件,否则默认是C++。

具体参数可以运行wsdl2h.exe /?查看帮助。

4.编译执行soapcpp2.exe webs.h,会生成很多个文件,这里同样可以加一些参数,具体不解释了,可以通过soapcpp2.exe /?命令来查看。

我们找出需要的以下几个文件:soapC.cppsoapClient.cppsoapH.hsoapStub.hWebsSoap.nsmap再加上另外两个文件(不在bin目录下,在gsoap-2.8\gsoap目录下):stdsoap2.hstdsoap2.cpp一共7个文件,就是我们最终访问WebService所需要的soap访问调用文件。

这里是C++的代码,根据需要,也可以生成C的代码,stdsoap2.cpp更换为stdsoap2.h文件。

把上述7个文件,加入到自己的工程中编译即可,接下来就是如何调用的问题了。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档