1、下载gSOAP
在gSOAP官网中可以找到最新的gSOAP安装包以及相关的文档
gSOAP官网:http://www.cs.fsu.edu/~engelen/soap.html
gSOAP下载地址:http://sourceforge.net/projects/gsoap2/files/
2、安装gSOAP
a、解压zip压缩包
命令:unzip gsoap_2.7.17.zip
b、进入解压后生成的文件夹gsoap-2.7
命令:cd gsoap-2.7/
c、切换到root用户
命令:su
输入密码
d、配置编译环境
在gsoap-2.7/文件夹下有一个configure文件,执行它,自动配置编译环境
命令:./configure
e、编译连接
命令:make
f、安装gSOAP
命令:make install
可用wsdl2h或者soapcpp2查看gSOAP是否已经安装成功
用命令whereis gsoap查看gSOAP安装到的位置
3、编写calc.h文件
a、新建一个文件夹calc
命令:mkdir calc
b、进入calc
命令:cd calc
c、创建文件calc.h,在文件中写入以下内容,保存
//gsoap ns service name: calc Simple calculator service
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://localhost/calc.wsdl
//gsoap ns service location: http://localhost/server.cgi
//gsoap ns schema namespace: urn:calc
int 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);
注意:
a、以上的几行注释中,gsoap ns service不能删除,但可以修改
b、ns__add等的ns后面是两个下划线
4、调用soapcpp2自动生成相关的文件
(为了方便代码管理,在calc文件夹下新建一个soap)
当前工作目录为calc/soap
命令:soapcpp2 -i ../calc.h
注意:
可能会报错,一般是不知道gsoap相关include文件的位置,可以使用
命令soapcpp2 -i ../calc.h -I /usr/include/gsoap
5、编写服务器端代码:server.cpp
当前工作目录:calc
#include "soap/soapcalcService.h"
#include "soap/calc.nsmap" //这个头文件不加的话,在链接的时候,stdsoap2.cpp里面会报无法引用namespaces
#include
using namespace std;
int main(int argc, char **argv) {
calcService calc;
int port = 65531;
if (calc.run(port)) {
cerr << "Calc service run failed" << endl;
exit(0);
}
return 0;
}
int calcService::add(double a, double b, double* result) {
*result = a + b;
return SOAP_OK;
}
int calcService::sub(double a, double b, double* result) {
*result = a - b;
return SOAP_OK;
}
int calcService::mul(double a, double b, double* result) {
*result = a * b;
return SOAP_OK;
}
int calcService::div(double a, double b, double* result) {
if (b) {
*result = a / b;
} else {
return SOAP_FAULT;
}
return SOAP_OK;
}
int calcService::pow(double a, double b, double *result) {
*result = ::pow(a, b);
if (soap_errno == EDOM) {
char *s = (char*) soap_malloc(this, 1024);
sprintf(s, "Can't take the power of %f to %f", a, b);
sprintf(s,"Can't take power of %f to %f",a, b);
return SOAP_FAULT;
}
return SOAP_OK;
}
6、编写客户端代码:client.cpp
#include "soap/soapcalcProxy.h"
#include "soap/calc.nsmap"
#include
using namespace std;
int main(int argc, char **argv) {
double a = 4;
double b = 2;
double result;
calcProxy calc;
calc.soap_endpoint = "http://localhost:65531";
calc.add(a,b,&result);
cout<
calc.sub(a,b,&result);
cout<