1 官網下載gsoap2.8.8.zip
2 安裝gsoap
a):如果在windows下 直接解壓縮 會有一個gsoap2.8的目錄。在\gsoap-2.8\gsoap\bin\ 目錄下面有對應的
b):在linux下解壓成gsoap2.8的目錄,安裝。安裝步驟
./configure
make
make install
裝gsoap 需要安裝openssl 才能安裝成功
c)windows下我沒有安裝。直接用bin目錄下面的 wsdl2h 和soapcpp2工具
linux安裝之后 wsdl2h 和soapcpp2 工具直接可以用
wsdl2h 根據webserveic生成 .h文件,soapcpp2根據生成.h文件生成相應的調用文件
這兩個工具使用方法如下:
注1 :wsdl2h的用法(WSDL/schema 解析和代碼生成器) wsdl2h [opt] 頭文件名 WSDL文件名或URL wsdl2h常用選項
-o 文件名,指定輸出頭文件
-n 名空間前綴 代替默認的ns
-c 產生純C代碼,否則是C++代碼
-s 不要使用STL代碼
-t 文件名,指定type map文件,默認為typemap.dat
-e 禁止為enum成員加上名空間前綴 type map文件用於指定SOAP/XML中的類型與C/C++之間的轉換規則,比如在wsmap.dat里寫
在本例中,使用的是:
wsdl2h -s -o calc.h http://www.cs.fsu.edu/~engelen/calc.wsdl
參數s就表示生成不帶STL的C/C++語法結構的頭文件calc.h。如果不用s就會生成帶STL的頭文件,這樣,在后邊的編譯中需要加入STL的頭 stlvector.h,位於:gsoap/import/目錄下。
注2 :soapcpp2的用法(編譯和代碼生成器) soapcpp2 [opt] 頭文件名 soapcpp2常用選項
- -C 僅生成客戶端代碼
- -S 生成服務器端代碼
- -L 不要產生soapClientLib.c和soapServerLib.c文件
- -c 產生純C代碼,否則是C++代碼(與頭文件有關)
- -I 指定import路徑(見上文)
- -x 不要產生XML示例文件
- -i 生成C++封裝(代理),客戶端為xxxxProxy.h(.cpp),服務器端為xxxxService.h(.cpp)。
d)例子:
i):vi add.h
添加如下內容:int ns__add( int num1, int num2, int* sum );
ii):soapcpp2 -S -x -L -i add.h 只生成C++的 服務器文件
會生成如下文件:
soapStub.h soapServer.cpp soapH.h soapC.cpp ns.nsmap 等文件
iii)vi addServer.cpp
如下內容:
#include "soapH.h"
#include "add.h"
#include "ns.nsmap"
#include <stdio.h>
int main(int argc, char* argv[])
{
int m, s; /* master and slave sockets */
struct soap add_soap;
soap_init(&add_soap);
//soap_set_namespaces(&add_soap, add_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);//該句說明該server的服務
soap_end(&add_soap);
}
}
return 0;
}
//server端的實現函數與add.h中聲明的函數相同,但是多了一個當前的soap連接的參數
int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
{
*sum = num1 + num2;
return 0;
}
iv):把gsoap-2.8\gsoap\目錄下面的 stdsoap2.cpp stdsoap.h拷貝到 該工程的目錄下面
v):gcc編譯 g++ soapC.cpp soapServer.cpp stdsoap2.cpp addServer.cpp -o addServer
vi)運行:./addServer 即可實現一個簡單的服務器程序
g++ addSerer.cpp so
完