linux下gsoap使用及移植
- 格式:pdf
- 大小:22.22 KB
- 文档页数:6
linux apt用法Linux APT(Advanced Packaging Tool)用法在Linux操作系统中,APT(Advanced Packaging Tool)是一种常用且功能强大的软件包管理工具。
它可以帮助用户方便地管理和安装各种软件包。
本文将详细说明APT的使用方法,并提供一步一步回答,以解决用户在使用APT时可能遇到的问题。
APT是由Debian Linux发行版开发的一个软件包管理系统,它的主要目的是使软件的安装、升级和卸载过程更加简单和自动化。
APT支持通过命令行界面进行操作,也可以通过图形用户界面(GUI)进行操作。
在本文中,我们将主要关注命令行界面。
APT的命令以apt开头,下面是一些最常用的APT命令及其用法:1. apt-get update:该命令用于更新本地软件包列表,从软件源(Software Repository)下载最新的软件包信息。
在使用任何其他APT命令之前,建议始终先运行这个命令。
使用以下命令来运行:sudo apt-get update2. apt-get upgrade:该命令用于升级已经安装的软件包到最新可用版本。
它会检查系统中已安装软件包的版本,并下载并安装最新的版本。
使用以下命令来运行:sudo apt-get upgrade3. apt-get install:该命令用于安装新的软件包。
可以通过软件包名称指定要安装的软件包。
使用以下命令来运行:sudo apt-get install <package_name>4. apt-get remove:该命令用于移除(卸载)已经安装的软件包,但保留与该软件包相关的配置文件。
使用以下命令来运行:sudo apt-get remove <package_name>5. apt-get purge:该命令用于完全移除(卸载)已经安装的软件包及其相关的配置文件。
使用以下命令来运行:sudo apt-get purge <package_name>6. apt-get autoremove:该命令用于移除系统中不再需要的已安装软件包。
gsoap使用方法及心得----CC++Linux一、环境准备在本文中,所有程序均在Linux下开发完成,经测试能够正常运行。
在开发过程中,我们需要用到gSOAP,可以从以下网址下载获得:我下载的是gsoap_2.7.12.tar.gz下载下来解压缩,按正常安装过程进行编译、安装。
# tar zxvf gsozp_2.7.12.tar.gz# cd gsoap_2.7.12# ./configure –-prefix=/usr/local/gSOAP(指定安装路径)# make# make install二、生成相关文件1、通过WSDL文档,生成C/C++头文件# /usr/local/gSOAP/bin/wsdl2h –c -o TestHeader.h2、拷贝gSOAP源代码中import文件夹下的stlvector.h文件到TestHeader.h同一目录,如果在解析WSDL文档时使用了-s参数,即不使用STL,则不需要拷贝这一文件。
2、解析TestHeader.h文件,生成存根程序# /usr/local/gSOAP/bin/soapcpp2 –c -C TestHeader.h命令中参数-c代表生成标准C程序,若没有这个参数,则生成C++程序。
命令中参数-C代表仅生成客户端程序,若没有这个参数,则默认生成客户端和服务端程序。
三、进行相关开发1、新建工程新建一个C的工程,并将刚刚生成的文件拷贝到工程中,设置工程属性,包含gSOAP源代码目录,链接属性处,需要包含文件libgsoap.a(使用C语言开发)或者libgsoap++.a(使用C++开发)。
2、代码开发WebService的具体调用方式可以参见生成的soapStub.h文件。
Demo代码(调用WebService的addUser):#include “soapH.h”#include “TestHeaderHttpBinding.nsmap”int main(){struct soap clientSOAP;struct _ns1__addUser addUserMsg;struct _ns1__addUserResponse addUserResponse;soap_init(&clientSOAP);addUserMsg.in0 = “test”;addUserMsg.in1 = “test”;addUserMsg.in2 = “test”;if(soap_call___ns1__addUser(&clientSOAP, NULL, NULL, &addUserMsg, &addUserResponse) == SOAP_OK){printf(“%sn”, *addUser Response.out);}else{printf(“Errorn”);}soap_destroy(&clientSOAP);soap_end(&clientSOAP);soap_done(&clientSOAP);return 0;}正常的话,编译运行后能够在控制台看到WebService返回的处理结果。
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是一款开源的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使用方法及心得(二)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使用小结分类:开发路上的点点滴滴 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个文件,加入到自己的工程中编译即可,接下来就是如何调用的问题了。
CentOS6.5 下编绎gSoap 相关问题及解决,开发环境准备:1,centos 为虚拟下安装,版本为32 位,(64 位同样可以,均测过,需注意的是红色部分内容)2,gSoap:gsoap_2.7tar.gz/~engelen/s oap.html载下来解压缩,按正常安装过程进行编译、安装。
# tar zxvf gsozp_2.7.12.tar.gz # cd gsoap_2.7.12 #./configure 或{./configure -p refix=/usr/local/gSOA P (指定安装路径) }# make # makeinstall问题: ../../ylwrap: line 111: yacc: command not found原因:没有安装:yacc(Yet Another Compiler Compiler)是Unix/Linux 上一个用来生成编译器的编译器 (编译器代码生成器)。
解决方案:sudo apt-get install flexbison(ubantu)yum install byacc(centos) 问题:gsoap-2.7/missing: line 46: flex: command not found决方法: yum install flex( 要重新运行./configure)(centos)apt-get install flex(ubantu) 问题:/usr/bin/ld: cannot find -ly 解决方法:yum install bison-devel(centos)apt-get install bison(ubantu) 问题:../../gsoap/stdsoap2.h:690:19: error: zlib.h: Nosuch file or directory 解决方法:缺少zlib,ubantu 下,apt-get installzlib-develcentos 下, yum installzlib-devel;问题:error: openssl/bio.h: No such file or directory解决方法:yum install openssl-devel(centos)ubantu 下:sudo apt-get install openssl 为了安装OpenSSL通常的库文件,首先使用以下命令来确定在Ubuntu 系统中可获得的库文件的应用版本:sudo apt-cache search libssl |grep SSL sudo apt-get installlibssl-dev至此基本可以了,面执行, make;makeinstall;+| You nowhave successfully built and installed gsoap. | ||| You can link your programs with -lgsoap++ for|| C++ projects created with soapcpp2 and you can link|| with -lgsoap for C projects generated with soapcpp2 -c |||| There are also corresponding libraries for SSL and|| zlib compression support (-lgsoapssl andlgsoapssl++)|| which require linking -lssl -lcrypto -lz | ||| Thanks for using gsoap.|| | | /projects/ gsoap2|+ + 出现此即安装成功;, 开发linux 下Web Service C/C++ 客户端这里,我们直接采用gSoap 工具包自带的wsdl2h 和soapcpp2 工具。
gsoap用户手册gSOAP是一个用于开发Web服务和XML数据处理的开源工具包。
它支持多种编程语言,包括C和C++,并提供了丰富的功能和工具来简化Web服务的开发和集成。
gSOAP用户手册是一个详细的文档,涵盖了gSOAP工具包的安装、配置、使用和高级特性等方面的内容。
用户手册通常包括以下内容:1. 安装指南,用户手册会提供安装gSOAP工具包的详细步骤,包括下载源代码、编译安装和配置环境等内容。
这部分内容通常会针对不同的操作系统和开发环境进行说明。
2. 快速入门,用户手册会介绍如何快速上手使用gSOAP工具包,包括创建一个简单的Web服务、生成客户端代码、编译和部署等内容。
这部分内容通常会包括示例代码和详细的步骤说明。
3. gSOAP基础,用户手册会介绍gSOAP工具包的基本概念和核心功能,包括如何定义和发布Web服务、如何处理XML数据、如何进行SOAP通信等内容。
这部分内容通常会涵盖gSOAP工具包的核心API和使用方法。
4. 高级特性,用户手册会介绍gSOAP工具包的高级特性和扩展功能,包括如何处理安全性、如何进行性能优化、如何集成其他协议等内容。
这部分内容通常会提供一些实际的应用场景和最佳实践。
5. 参考资料,用户手册通常会包括一些附录和参考资料,如API参考、配置文件说明、常见问题解答等内容,以方便开发者查阅和深入理解gSOAP工具包。
总的来说,gSOAP用户手册是开发者学习和使用gSOAP工具包的重要参考资料,它提供了全面而详细的内容,帮助开发者快速上手并深入理解gSOAP工具包的各项功能和特性。
希望这些信息能够对你有所帮助。
Linux下gsoap的使用及移植1、下载gsoap在gsoap的官网中可以找到最新的gsoap安装包及相关文档gsoap官网:/~engelen/soap.html下载地址:/projects/gsoap2/files/2、安装gsoapa、解压zip压缩包命令:unzip gsoap_2.8.1.zipb、进入解压后生成的文件夹gsoap-2.8命令:cd gsoap-2.8/c、切换到root用户命令:su输入密码d、配置编译环境在gsoap-2.8/文件夹下执行configure文件,自动配置编译环境命令:./configuree、编译连接命令:makef、安装gsoap命令:make install安装完毕可用wsdl2h或soapcpp2查看gsoap是否已经安装成功看到上述两个命令的返回说明安装成功3、应用实例wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序首先新建一个文件夹名为gsoap;然后(1)不使用wsdl2ha、不使用wsdl2h我们可以直接从.h文件来生成代码。
我们先定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下://gsoapopt cw//gsoap ns2 schema namespace: urn:add//gsoap ns2 schema form: unqualified//gsoap ns2 service name: add//gsoap ns2 service type: addPortType//gsoap ns2 service port:/~engelen/addserver.cgi//gsoap ns2 service namespace: urn:add//gsoap ns2 service transport: /soap/http//gsoap ns2 service method-style: add rpc//gsoap ns2 service method-encoding:add /soap/encoding///gsoap ns2 service method-action: add ""int ns2__add( int num1, int num2, int* sum );b、执行soapcpp2 –c add.h,自动生成一些远程调用需要的文件c、接下来写一个服务端,创建文件addserver.c#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, namespaces);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, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);soap_serve(&add_soap);soap_end(&add_soap);}}return 0;}int ns2__add(struct soap *add_soap, int num1, int num2, int *sum){*sum = num1 + num2;return 0;}d、接着写一个客户端,文件名为addclient.c#include "soapStub.h"int add(const char *server, int num1, int num2, int *sum){struct soap add_soap;int result = 0;soap_init(&add_soap);soap_set_namespaces(&add_soap, namespaces);soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);if (add_soap.error){printf("soap error: %d, %s, %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;}e、最后写一个测试代码,addtest.c#include <stdio.h>#include <stdlib.h>#include <string.h>int add(const char *server, int num1, int num2, int *sum);int main(int argc, char **argv){int result = -1;char server[128] = {0};int num1;int num2;int sum;if (argc < 4) {printf("usage: %s <ip:port> num1 num2 \n", argv[0]);exit(1);}strcpy(server,argv[1]);num1 = atoi(argv[2]);num2 = atoi(argv[3]);result = add(server, num1, num2, ∑);if (result != 0){printf("soap error, errcode=%d\n", result);}else{printf("%d + %d = %d\n", num1, num2, sum);}return 0;}f、到目前为止,自己的代码编写完毕,接下来编译服务端和客户端注意:编译的时候要把gsoap包里的源代码文件stdsoap2.c和stdsoap2.h拷贝到当前目录Makefile文件:GSOAP_ROOT = gsoap的解压路径/gsoapWSNAME = addCC = g++ -g -DWITH_NONAMESPACESINCLUDE = -I$(GSOAP_ROOT)SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.oCLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.oall: serverserver: $(SERVER_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)client: $(CLIENT_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)cl:rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test然后执行make,即可生成addserver程序;执行make client,生成addtest程序g、运行程序执行./addserver 7777终端打印出:Socket connection successful: master socket = 3这是sever已经在前台运行起来了运行客户端./addtest ip地址:port num1 num2 返回加法的结果第一个简单的例子到此结束(2)使用wsdl2ha、建立一个新的目录,命名为weather命令:mkdir weatherb、利用gsoap 工具生成webserice 协义代码,wsdl2h从服务器下载头文件,soapcpp2相当于代码生成品,根据头文件生成相应的.c 文件和.nsmap 文件。
7.4GSOAP工具的安装和使用7.4.1GSOAP安装GSOAP工具可以在WIN和UNIX两个系统平台下运行,这就使我们的程序在跨平台上有了基础。
工具的安装包可浏览其主页下载。
本DEMO的开发使用的版本为gsoap_win32_2.7.9l,工具的运行环境是Windows系统。
图7.12 Windows下的GSOAP安装包图7.13 LINUX或UNIX下的GSOAP安装包设置系统环境变量,这样可以很方便的使用GSOAP工具,如下为GSOAP的两个工具,我们将他们设置到可以在DOS下可直接使用的程序。
图7.14 GSOAP两个工具程序图7.15 GSOAP使用方法7.4.2生成客户端文件Wsdl2h.exe的参数说明参见7.5.1节图7.16 在DOS下使用wsdl2h.exe工具生成SendSMSClient.h文件图7.17 生成成功图7.18 生成的文件(短信为例)Soapcpp2.exe工具的参数说明参见7.5.2 节图7.19 根据.h生成客户端的文件图7.20 生成成功提示信息图7.21 生成的客户端文件表7.1 生成文件的说明其他文件在项目中没有使用,在此不做介绍,如需了解参看网络资料。
7.4.3生成服务端文件Wsdl2h.exe的参数说明参见7.5.1节图7.22 创建WEB SERVICE的.h文件图7.23 生成的文件Soapcpp2.exe工具的参数说明参见7.5.2 节图7.24 生成WEB SERVICE服务端文件图7.25 生成的服务端文件7.5GSOAP工具的参数soapcpp2.exe: gSOAP编译器,编译头文件生成服务器和客户端都需要的c/c++文件。
wsdl2h.exe: 编译wsdl文件生成c/c++头文件。
7.5.1wsdl2h.exe的使用wsdl2h是将wsdl定义转换成.h文件的工具。
主要有一些选项:-c代表转化成C代码。
-s代表不使用STL,取而代之需要在工程中包含stdsoap2.h和stdsoap2.cpp。
Linux下gsoap的使用及移植1、下载gsoap在gsoap的官网中可以找到最新的gsoap安装包及相关文档gsoap官网:/~engelen/soap.html下载地址:/projects/gsoap2/files/2、安装gsoapa、解压zip压缩包命令:unzip gsoap_2.8.1.zipb、进入解压后生成的文件夹gsoap-2.8命令:cd gsoap-2.8/c、切换到root用户命令:su输入密码d、配置编译环境在gsoap-2.8/文件夹下执行configure文件,自动配置编译环境命令:./configuree、编译连接命令:makef、安装gsoap命令:make install安装完毕可用wsdl2h或soapcpp2查看gsoap是否已经安装成功看到上述两个命令的返回说明安装成功3、应用实例wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序首先新建一个文件夹名为gsoap;然后(1)不使用wsdl2ha、不使用wsdl2h我们可以直接从.h文件来生成代码。
我们先定义一个函数声明文件,用来定义接口函数,名称为add.h,内容如下://gsoapopt cw//gsoap ns2 schema namespace: urn:add//gsoap ns2 schema form: unqualified//gsoap ns2 service name: add//gsoap ns2 service type: addPortType//gsoap ns2 service port:/~engelen/addserver.cgi//gsoap ns2 service namespace: urn:add//gsoap ns2 service transport: /soap/http//gsoap ns2 service method-style: add rpc//gsoap ns2 service method-encoding:add /soap/encoding///gsoap ns2 service method-action: add ""int ns2__add( int num1, int num2, int* sum );b、执行soapcpp2 –c add.h,自动生成一些远程调用需要的文件c、接下来写一个服务端,创建文件addserver.c#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, namespaces);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, stderr);exit(-1);}fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);soap_serve(&add_soap);soap_end(&add_soap);}}return 0;}int ns2__add(struct soap *add_soap, int num1, int num2, int *sum){*sum = num1 + num2;return 0;}d、接着写一个客户端,文件名为addclient.c#include "soapStub.h"int add(const char *server, int num1, int num2, int *sum){struct soap add_soap;int result = 0;soap_init(&add_soap);soap_set_namespaces(&add_soap, namespaces);soap_call_ns2__add(&add_soap, server, NULL, num1, num2, sum);printf("server is %s, num1 is %d, num2 is %d\n", server, num1, num2);if (add_soap.error){printf("soap error: %d, %s, %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;}e、最后写一个测试代码,addtest.c#include <stdio.h>#include <stdlib.h>#include <string.h>int add(const char *server, int num1, int num2, int *sum);int main(int argc, char **argv){int result = -1;char server[128] = {0};int num1;int num2;int sum;if (argc < 4) {printf("usage: %s <ip:port> num1 num2 \n", argv[0]);exit(1);}strcpy(server,argv[1]);num1 = atoi(argv[2]);num2 = atoi(argv[3]);result = add(server, num1, num2, ∑);if (result != 0){printf("soap error, errcode=%d\n", result);}else{printf("%d + %d = %d\n", num1, num2, sum);}return 0;}f、到目前为止,自己的代码编写完毕,接下来编译服务端和客户端注意:编译的时候要把gsoap包里的源代码文件stdsoap2.c和stdsoap2.h拷贝到当前目录Makefile文件:GSOAP_ROOT = gsoap的解压路径/gsoapWSNAME = addCC = g++ -g -DWITH_NONAMESPACESINCLUDE = -I$(GSOAP_ROOT)SERVER_OBJS = soapC.o stdsoap2.o soapServer.o $(WSNAME)server.oCLIENT_OBJS = soapC.o stdsoap2.o soapClient.o $(WSNAME)client.o $(WSNAME)test.oall: serverserver: $(SERVER_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)server $(SERVER_OBJS)client: $(CLIENT_OBJS)$(CC) $(INCLUDE) -o $(WSNAME)test $(CLIENT_OBJS)cl:rm -f *.o *.xml *.a *.wsdl *.nsmap soapH.h $(WSNAME)Stub.* $(WSNAME)server ns.xsd $(WSNAME)test然后执行make,即可生成addserver程序;执行make client,生成addtest程序g、运行程序执行./addserver 7777终端打印出:Socket connection successful: master socket = 3这是sever已经在前台运行起来了运行客户端./addtest ip地址:port num1 num2 返回加法的结果第一个简单的例子到此结束(2)使用wsdl2ha、建立一个新的目录,命名为weather命令:mkdir weatherb、利用gsoap 工具生成webserice 协义代码,wsdl2h从服务器下载头文件,soapcpp2相当于代码生成品,根据头文件生成相应的.c 文件和.nsmap 文件。
命令:wsdl2h -c -o weather.h /Service.asmx?WSDL注:-c 生成.c 文件命令:soapcpp2 -x -C -c weather.h-x 不生成xml 文件-C 只生成客户端相关代码c 、拷贝gsoap 目录下的stdsoap2.h stdsoap2.c 两个文件到 weather 目录下。
d 、编写客户端程序,也就是调用刚刚生成代码中接口函数。
#vim weather.ce 、编写makefile#CROSS_COMPILER:=CC:=$(CROSS_COMPILER)gccGCC:=$(CROSS_COMPILER)g++#include<stdio.h>#include"soapH.h"#include"ServiceSoap.nsmap"#define CITY_NAME "北京"int main(int argc, char *argv[]){struct soap soap;int ret = 0;int element = 0;int i = 0;soap_init(&soap);soap_set_mode(&soap, SOAP_C_UTFSTRING); soap.mode |= SOAP_C_UTFSTRING;struct _ns1__getWeatherbyCityName cityname;struct _ns1__getWeatherbyCityNameResponse response;cityname.theCityName = CITY_NAME;cityname.theDayFlag = 0;if(soap_call___ns3__getWeatherbyCityName(&soap, NULL, NULL, &cityname, &response) == SOAP_OK){printf("get weather ok !\n");element = response.getWeatherbyCityNameResult->__sizestring;for(i = 0; i < element; i++) {printf("i(%d), string(%s)\n", i, response.getWeatherbyCityNameResult->string[i]);}}else{printf("soap_call___ns3__getWeatherbyCityName failed!\n"); }soap_destroy(&soap);soap_end(&soap);soap_done(&soap); return 0;}all:$(CC) -o weather weather.c soapC.c soapClient.c stdsoap2.cclean:rm -f weatherf、编译、执行程序命令:make命令:./weather执行成功则返回get weather ok !i(0) string((null))i(1), string(北京)i(2), string(晴)i(3), string(7 ~ -4 ℃)i(4), string(北风4-5级转微风)i(5), string(今天)i(6), string(/images/晴.gif)i(7), string((null))g、常见问题:1程序编绎通过,但是运行./weather是失败,打印soap_call___ns3__getWeatherbyCityName failed答:可能是你的linux主机的网络有问题,试试ping 一下其它网络地址是否成功。