http://www.cs.fsu.edu/~engelen/soapdoc2.html
http://www.cs.fsu.edu/~engelen/soapdoc2.html#tth_sEc19.22
gSOAP一种跨平台的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安全性:认证令牌,数字签名。
速度:架构特定的编译器生成的代码速度快。基准测试表明速度优于最快的XML解析器。
占用内存小:客户端应用程序总运行内存占用很小。内存管理使用垃圾收集,可以自动清理。
许多例子:软件包,包括许多代码范例,其中包括独立的HTTP/1.1和HTTPS安全的Web服务器。
Web服务器整合:包括Apache_mod, IIS, WinInet, CGI, FastCGI。
gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。
gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它来为你的web服务生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。
下面是gSOAP的一些特点:
×gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。
×gSOAP支持WSDL 1.1, SOAP 1.1, SOAP 1.2, SOAP RPC 编码方式以及 literal/document 方式.
×gSOAP是少数完全支持SOAP1.1 RPC编码功能的工具包,包括多维数组及动态类型。比如,一个包含一个基类参数的远程方法可以接收客户端
传来的子类实例。子类实例通过动态绑定技术来保持一致性。
×gSOAP 支持 MIME (SwA) 和 DIME 附件包。
×gSOAP是唯一支持DIME附件传输的工具包。它允许你在保证XML可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据
gSOAP2.0及之后的版本是在1.x版基础上重写的。gSOAP2.0之后的版本是线程安全的,但之前版本不是。gSOAP2.x版本中的主要文件已经重新
命名,以便与1.x版区分。
gSOAP 1.X gSOAP 2.X
soapcpp soapcpp2
soapcpp.exe soapcpp2.exe
stdsoap.h stdsoap2.h
stdsoap.c stdsoap2.c
stdsoap.cpp stdsoap2.cpp
soap_init(struct soap *soap) 初始化环境变量(只需执行一次)
struct soap *soap_new() 定义并初始化环境变量并返回一个该变量的指针
struct soap *soap_copy(struct soap *soap) 定义一个环境变量并从已有的环境变量中拷贝环境信息
The wsdl2h WSDL/schema importer and data binding mapper tool.
wsdl2h的参数含义:
case 'h':
fprintf(stderr, "Usage: wsdl2h [-a] [-b] [-c] [-d] [-e] [-f] [-g] [-h] [-I path] [-i] [-j] [-k] [-l] [-m] [-N name] [-n name] [-P|-p] [-q name] [-r proxyhost[:port[:uid:pwd]]] [-s] [-t typemapfile] [-u] [-v] [-w] [-W] [-x] [-y] [-z#] [-_] [-o outfile.h] infile.wsdl infile.xsd http://www... ...\n\n");
fprintf(stderr, "\
-a generate indexed struct names for local elements with anonymous types\n\
-b bi-directional operations (duplex ops) to serve one-way response messages\n\
-c generate C source code\n\ ------默认为生成C++头文件,此参数保证生成C头文件。
-d use DOM to populate xs:any, xs:anyType, and xs:anyAttribute\n\
-e don't qualify enum names\n\
-f generate flat C++ class hierarchy\n\
-g generate global top-level element declarations\n\
-h display help info\n\
-Ipath use path to find files\n\
-i don't import (advanced option)\n\
-j don't generate SOAP_ENV__Header and SOAP_ENV__Detail definitions\n\
-k don't generate SOAP_ENV__Header mustUnderstand qualifiers\n\
-l display license information\n\
-m use xsd.h module to import primitive types\n\
-Nname use name for service namespace prefixes and multiple bindings\n\
-nname use name as the base namespace prefix instead of 'ns'\n\
-ofile output to file\n\ ---指定输出文件
-P don't create polymorphic types inherited from xsd__anyType\n\
-p create polymorphic types inherited from base xsd__anyType\n\
-qname use name for the C++ namespace of all declarations\n\ --- 定义名字空间
-rhost[:port[:uid:pwd]]\n\
connect via proxy host, port, and proxy credentials\n\
-s don't generate STL code (no std::string and no std::vector)\n\
-tfile use type map file instead of the default file typemap.dat\n\
—— typemap.dat包含信息,如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"
-u don't generate unions\n\
-v verbose output\n\
-W suppress warnings\n\
-w always wrap response parameters in a response struct (<=1.1.4 behavior)\n\
-x don't generate _XML any/anyAttribute extensibility elements\n\
-y generate typedef synonyms for structs and enums\n\
-z1 compatibility with 2.7.6e: generate pointer-based arrays\n\
-z2 compatibility with 2.7.7 to 2.7.15: qualify element/attribute references\n\
-z3 compatibility with 2.7.16 to 2.8.7: qualify element/attribute references\n\
-z4 compatibility up to 2.8.11: don't generate union structs in std::vector\n\
-_ don't generate _USCORE (replace with UNICODE _x005f)\n\
infile.wsdl infile.xsd http://www... list of input sources (if none: use stdin)\n\
\n");
wsdl2h -qsoap_cm -o soap_cmServiceC.h -d -u wsdl/32607-703.wsdl -c -t wsdl/typemap.dat
wsdl2h -qsoap_cm -o soap_cmService.h -d -u wsdl/32607-703.wsdl -t wsdl/typemap.dat
The soapcpp2 stub/skeleton compiler and code generator.
soapcpp2的参数:
case 'h':
fprintf(stderr, "Usage: soapcpp2 [-1|-2|-0] [-C|-S] [-T] [-L] [-a] [-A] [-b] [-c] [-d path] [-e] [-f N] [-h] [-i] [-I path"SOAP_PATHSEP"path"SOAP_PATHSEP"...] [-k] [-l] [-m] [-n] [-p name] [-s] [-t] [-u] [-v] [-w] [-x] [-y] [infile]\n\n");
fprintf(stderr, "\
-1 generate SOAP 1.1 bindings\n\
-2 generate SOAP 1.2 bindings\n\
-0 remove SOAP bindings (when not explicitly set by directives)\n\
-C generate client-side code only\n\
-S generate server-side code only\n\
-T generate server auto-test code\n\
-L don't generate soapClientLib/soapServerLib\n\
-a use SOAPAction with WS-Addressing to invoke server-side operations\n\
-A require SOAPAction to invoke server-side operations\n\
-b serialize byte arrays char[N] as string\n\
-c generate C source code\n\
-dpath use path to save files\n\
-e generate SOAP RPC encoding style bindings\n\
-fN file split of N XML serializer implementations per file (N>=10)\n\
-h display help info\n\
-Ipath use path(s) for #import (paths separated with '"SOAP_PATHSEP"')\n\
-i generate C++ service proxies and objects inherited from soap struct\n\ --- 生成对象为soap的子类,会影响生成文件的使用方法。
如namespace soap_cm {
class SOAP_CMAC BasicCMIRPService : public soap
-j generate C++ service proxies and objects that share a soap struct\n\
-k generate data structure walkers (experimental)\n\
-l generate linkable modules (experimental)\n\ --- 此文件夹为gsoap的import文件夹
-m generate Matlab(tm) code for MEX compiler\n\
-n use service name to rename service functions and namespace table\n\
-pname save files with new prefix name instead of 'soap'\n\
-Qname use name as the C++ namespace for decls, including custom serializers\n\
-qname use name as the C++ namespace for decls, excluding custom serializers\n\
-s generate deserialization code with strict XML validation checks\n\
-t generate code for fully xsi:type typed SOAP/XML messaging\n\
-u uncomment comments in WSDL/schema output by suppressing XML comments\n\
-v display version info\n\
-w don't generate WSDL and schema files\n\
-x don't generate sample XML message files\n\
-y include C/C++ type access information in sample XML messages\n\
infile header file to parse (or stdin)\n\
\n");
soapcpp2 -C -n -qsoap_cm -i -IXXX/import soap_cmService.h
style="document"
stype="RPC"
不同也会导致生成文件不同,使用方式的不同。
An XML schema (XSD file) can be transformed into a set of C or C++ definitions that can be readily incorporated into your application to manipulate XML with much more ease than DOM or SAX.
soap_mode sm=SOAP_IO_FLUSH;
sm |= SOAP_IO_KEEPALIVE;
sm |= SOAP_XML_INDENT;
sm |= SOAP_XML_STRICT;
sm = sm|SOAP_DOM_NODE|SOAP_C_UTFSTRING; ---- 编码设置为UTF-8的格式
soap_set_mode(this, sm);
c++ -DWITH_OPENSSL -o myprog myprog.cpp stdsoap2.cpp soapC.cpp soapServer.cpp -lssl -lcrypto
Let's take a look at an example SSL secure multi-threaded stand-alone SOAP Web Service:
int main() { int m, s; pthread_t tid; struct soap soap, *tsoap; soap_ssl_init(); /* init OpenSSL (just once) */ ---- 有些版本包含在soap_init中。 if (CRYPTO_thread_setup()) // OpenSSL -------------------- 为了多线程安全,初始化“锁”等。 { fprintf(stderr, "Cannot setup thread mutex\n"); exit(1); } soap_init(&soap); ---------------------- if (soap_ssl_server_context(&soap, -------------------------服务器端初始化 SOAP_SSL_DEFAULT, |
去除压缩算法:
STACK_OF(SSL_COMP)* comp_methods = SSL_COMP_get_compression_methods();
sk_SSL_COMP_zero(comp_methods);