linux下gsoap使用及移植
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Linux下gsoap的使用及移植
1、下载gsoap
在gsoap的官网中可以找到最新的gsoap安装包及相关文档
gsoap官网:/~engelen/soap.html
下载地址:/projects/gsoap2/files/
2、安装gsoap
a、解压zip压缩包
命令:unzip gsoap_2.8.1.zip
b、进入解压后生成的文件夹gsoap-2.8
命令:cd gsoap-2.8/
c、切换到root用户
命令:su
输入密码
d、配置编译环境
在gsoap-2.8/文件夹下执行configure文件,自动配置编译环境
命令:./configure
e、编译连接
命令:make
f、安装gsoap
命令:make install
安装完毕可用wsdl2h或soapcpp2查看gsoap是否已经安装成功
看到上述两个命令的返回说明安装成功
3、应用实例
wsdl2h -o outfile.h infile.wsdl 实现wsdl文件到h文件的数据映射
soapcpp2 -c outfile.h生成相应的底层通信stub,strech程序
首先新建一个文件夹名为gsoap;然后
(1)不使用wsdl2h
a、不使用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
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
#include
#include
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
exit(1);
}
strcpy(server,argv[1]);
num1 = atoi(argv[2]);
num2 = atoi(argv[3]);
result = add(server, num1, num2, ∑);