天天看點

VS2008 gsoap 筆記

材料

Gsoap下載下傳位址:

https://sourceforge.net/projects/gsoap2/files/gSOAP/

使用者使用說明位址:

http://www.genivia.com/doc/soapdoc2.html

http://www.phpstudy.net/e/wsdl/index.html

相關參考連結在文章末尾。

soapcpp2.exe、wsdl2h.exe工具具體說明請看下面連結

http://blog.csdn.net/guxch/article/details/8332701

源碼下載下傳位址:

http://download.csdn.net/detail/qqwoaidushu88/9587879 

開始搞

下載下傳,打開上面的下載下傳位址,我選的是gsoap_2.8.33.zip 版本,點選後下載下傳,下載下傳後解壓。

VS2008 gsoap 筆記

先照着CSND的文章做一個簡單的兩個整數加法例子。

步驟1:相關檔案生成,建立個檔案夾我把它命名為 myFirstGsoapTest且放在D盤根目錄,把soapcpp2.exe、wsdl2h.exe這兩個檔案拷到myFirstGsoapTest目錄下。

VS2008 gsoap 筆記

步驟2:拷貝stdsoap2.h,stdsoap2.cpp兩個檔案到myFirstGsoapTest目錄下(這兩個檔案可以不用拷貝,這裡隻是為了待會兒生成相關檔案後友善拷貝到工程目錄下),檔案所在位置是gsoap_2.8.33\gsoap-2.8\gsoap\。

VS2008 gsoap 筆記

步驟3:接下來就是建立空項目,命名為Server。

VS2008 gsoap 筆記
VS2008 gsoap 筆記

步驟4:在myFirstGsoapTest目錄下建立一個add.h檔案,打開後并編輯複制黏貼下面的代碼,包括注釋(這些注釋在C++中是沒用的但是soapcpp2.exe會根據它命名一些輸出的檔案)。

//gsoap ns service name: add
//gsoap ns service namespace: http://localhost/add.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: add.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:add

int ns__add( int num1, int num2, int* sum );
           
VS2008 gsoap 筆記

頭檔案中 函數名要用ns__開頭,如果是std::string類型要用 typedef std::string xsd__string;這樣gsoap内部便于生成wsdl和xml(網上是這麼說的);”ns__”中是兩個”_”。

步驟5:接着就是生成相關檔案

打開cmd 進到D:\myFirstGsoapTest\目錄下,輸入“soapcpp2.exe  add.h”回車就可以生成預設的檔案,這裡我沒使用參數,如果想使用參數可以根據工具具體說明自己玩一下。

VS2008 gsoap 筆記

執行完後再看D:\myFirstGsoapTest\目錄,多出一些檔案。

VS2008 gsoap 筆記

以上這五步是生成用戶端和服務端兩者所需的檔案,在生成這些檔案的基礎上接下來就是服務端的實作。

步驟6:服務端

然後選擇add.nsmap、soapC.cpp、soapC.h、soapServer.cpp、soapStub.h、add.h、stdsoap2.cpp、stdsoap2.h,拷貝到D:\myFirstGsoapTest\Server\Server目錄下

VS2008 gsoap 筆記
VS2008 gsoap 筆記

步驟7:在工程裡添加Server.spp

VS2008 gsoap 筆記

步驟8:加入以下代碼

#include <stdio.h>
#include "add.h"
#include "add.nsmap"

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;
	printf("%d+%d=%d\n",num1,num2,*sum);
	return 0;
}
           

步驟9:添加WS2_32.lib

VS2008 gsoap 筆記

步驟10:修改輸出(為了友善指令行運作)

VS2008 gsoap 筆記

步驟11:嘗試編譯,有錯就修改。

VS2008 gsoap 筆記

步驟12:回到指令行,輸入Server.exe 8888 回車

VS2008 gsoap 筆記

步驟13:另外啟動一個cmd使用telnet指令檢測9999端口是否被打開了,如果顯示的是一個光标在閃那就是打開了。

VS2008 gsoap 筆記

步驟14:用戶端

再在D:\myFirstGsoapTest建立一個用戶端空工程命名為Client,步驟同上。

步驟15:建立好後選擇add.nsmap、soapC.cpp、soapC.h、soapClient.cpp、soapStub.h、add.h、stdsoap2.cpp、stdsoap2.h,拷貝到D:\myFirstGsoapTest\Client\Client目錄下(注意與服務端不同的是拷貝soapClient.cpp)

VS2008 gsoap 筆記

步驟16:并添加現有項到工程,再建立Client.cpp檔案,添加wsock32.lib動态庫,同服務端一樣修改輸出目錄為D:\myFirstGsoapTest\。

拷貝以下代碼:

#include <stdio.h>
#include <stdlib.h>
#include "soapH.h"
#include "add.nsmap"

int add(const char* server, int num1, int num2, int *sum);

int main(int argc, char **argv) 
{
	int result = -1;
	char* server="http://localhost:9999";
	int num1 = 0;
	int num2 = 0;
	int sum = 0;
	if( argc < 3 )
	{
		printf("usage: %s num1 num2 \n", argv[0]);
		exit(0);
	}

	num1 = atof(argv[1]);
	num2 = atof(argv[2]);

	result = add(server, num1, num2, &sum);
	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("%d+%d=%d\n", num1, num2, sum );
	}
	return 0;
}

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, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__add( &add_soap, server, "", num1, num2, sum );
	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;
}
           

編譯,注意這個端口要和服務端一緻,不然連不上;

VS2008 gsoap 筆記

步驟17:再用cmd測試,進入D:\myFirstGsoapTest\目錄  輸入Client.exe  4  5

VS2008 gsoap 筆記

多次測試程式可以達到兩個整數的加法操作。

結構體

其實大部分時候的需求都是去擷取資料,比如擷取一個使用者的基本資訊,通常會用結構體來儲存一個使用者的資訊比如

struct user{
	char gender;
	int age;
	int UID;
	char* name;
};
           

先看下網上的說法

VS2008 gsoap 筆記

結構體要ns__開頭,且要有父結構體,那就照着寫

struct ns__user{
	char gender;
	int age;
	int UID;
	char* name;
};


//帶父結構
struct SingleIn_Out
{
	struct ns__user userInfo;
};
           

步驟1:D:\myFirstGsoapTest\目錄建立structIO.h,貼入以下代碼

#include <string>
//gsoap ns service name: structIO
//gsoap ns service namespace: http://localhost/structIO.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: structIO.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:structIO

typedef std::string xsd__string;

struct ns__user{
	char gender;
	int age;
	int UID;
	xsd__string name;
};

//結構體
struct SingleIn_Out
{
	struct ns__user userInfo;
};

int ns__add(double a, double b, double *result);

//結構體
int ns__singleInAndOut(struct SingleIn_Out myinput,struct SingleIn_Out&myoutput);
           

步驟2:使用指令行生成gsoap所需的檔案

步驟3:在D:\myFirstGsoapTest\目錄建立服務端空項目,命名為StructServer

步驟4:在D:\myFirstGsoapTest\目錄建立用戶端空項目,命名為StructClient

步驟5:選擇structIO.nsmap、soapC.cpp、soapC.h、soapServer.cpp、soapStub.h、structIO.h、stdsoap2.cpp、stdsoap2.h,拷貝到D:\myFirstGsoapTest\StructServer\StructServer目錄下

步驟6:選擇structIO.nsmap、soapC.cpp、soapC.h、soapClient.cpp、soapStub.h、structIO.h、stdsoap2.cpp、stdsoap2.h,拷貝到D:\myFirstGsoapTest\StructClient\StructClient目錄下

步驟7:添加現有項到服務端和用戶端工程

步驟8:添加Server.cpp檔案到服務端,并拷貝以下代碼:

#include <stdio.h>
#include "structIO.h"
#include "structIO.nsmap"
#include <iostream>

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, double num1, double num2, double *sum)
{
	*sum = num1 + num2;
	printf("%lf+%lf=%lf\n",num1,num2,*sum);
	return 0;
}



//結構體
int ns__singleInAndOut(struct soap *soap,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput)
{
	//輸出用戶端傳入的結構體
	printf("----------------client------------------------\n");
	printf("年齡%d\n",myinput.userInfo.age);
	printf("性别%d\n",myinput.userInfo.gender);
	printf("ID %d\n",myinput.userInfo.UID);
	//printf("姓名%s\n",myinput.userInfo.name);
	std::cout<<"姓名"<<myinput.userInfo.name<<std::endl;

//修改結構體後傳回給用戶端
	myoutput.userInfo.age	=myinput.userInfo.age+10;
	myoutput.userInfo.gender=myinput.userInfo.gender;
	myoutput.userInfo.UID	=myinput.userInfo.UID+10;
	myoutput.userInfo.name	=myinput.userInfo.name;

	return 0;
}
           

步驟9:修改工程輸出目錄,添加ws2_32.lib動态庫,生成項目。

此時vc會報錯error C2011: 'ns__user' : 'struct' type redefinition提示結構體重定義,解決的方法就是注釋D:\myFirstGsoapTest\StructServer\StructServer\structIO.h結構體定義部分,再重新生成就行了。

VS2008 gsoap 筆記
VS2008 gsoap 筆記

步驟10:添加Client.cpp檔案到用戶端,并拷貝以下代碼

#include <stdio.h>
#include <stdlib.h>
#include "soapH.h"
#include "structIO.nsmap"
#include <iostream>


int  add(const char* server, double num1, double num2, double *sum);
int singleInAndOut(const char* server,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput);

void testAdd(int argc, char **argv)
{
	double result = -1;
	char* server="http://localhost:8888";
	double num1 = 0;
	double num2 = 0;
	double sum = 0;
	if( argc < 3 )
	{
		printf("usage: %s num1 num2 \n", argv[0]);
		exit(0);
	}

	num1 = atof(argv[1]);
	num2 = atof(argv[2]);

	result = add(server, num1, num2, &sum);
	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("%lf+%lf=%lf\n", num1, num2, sum );
	}
}


void testSingle()
{

	char* server="http://localhost:8888";
	struct SingleIn_Out myinput;
	myinput.userInfo.age=10;
	myinput.userInfo.gender=1;
	myinput.userInfo.UID=1000;
	myinput.userInfo.name="xiaoming";

	printf("----------------begin------------------------\n");
	printf("年齡%d\n",myinput.userInfo.age);
	printf("性别%d\n",myinput.userInfo.gender);
	printf("ID %d\n",myinput.userInfo.UID);
	//printf("姓名%s\n",myinput.userInfo.name);
	std::cout<<"姓名"<<myinput.userInfo.name<<std::endl;

	struct SingleIn_Out myoutput;
	double result = -1;
	result = singleInAndOut(server, myinput, myoutput);

	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("----------------return------------------------\n");
		printf("年齡%d\n",myoutput.userInfo.age);
		printf("性别%d\n",myoutput.userInfo.gender);
		printf("ID %d\n",myoutput.userInfo.UID);
		std::cout<<"姓名"<<myinput.userInfo.name<<std::endl;
	}
}



int main(int argc, char **argv) 
{
	//testAdd(argc,argv);
	testSingle();
	return 0;
}

int add( const char* server, double num1, double num2, double *sum )
{
	struct soap add_soap;
	int result = 0;
	soap_init(&add_soap);
	//    soap_set_namespaces(&add_soap, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__add( &add_soap, server, "", num1, num2, sum );
	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;
}

int singleInAndOut(const char* server,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput)
{
	//傳入結構體
	struct soap add_soap;
	int result = 0;
	soap_init(&add_soap);
	//soap_set_namespaces(&add_soap, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__singleInAndOut( &add_soap, server, "", myinput, myoutput);
	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;
}
           

步驟11:與服務端相比用戶端可以不注釋結構體定義生成時也不會報錯,修改工程輸出目錄,添加ws2_32.lib動态庫,生成項目。

步驟12:使用指令行啟動服務端 端口為8888,再另啟一個指令行啟動用戶端測試。結果如下,完成。

VS2008 gsoap 筆記

要注意的地方就是服務端要注釋結構體定義再生成可執行檔案。

繼續,有時需要傳入或傳回一組使用者資訊。

那開搞

步驟1:在D:\myFirstGsoapTest\目錄下建立一個structArrayIO.h檔案,并拷貝以下代碼

//gsoap ns service name: structArrayIO
//gsoap ns service namespace: http://localhost/structArrayIO.wsdl
//gsoap ns service location: http://localhost
//gsoap ns service executable: structArrayIO.cgi
//gsoap ns service encoding: encoded
//gsoap ns schema namespace: urn:structArrayIO

struct ns__user{
	char gender;
	int age;
	int UID;
	char* name;
};

//結構體
struct SingleIn_Out
{
	struct ns__user userInfo;
};

//數組
struct ArryIn_Out
{
	struct ns__user**__ptr;
	int __size;
};


int ns__add(double a, double b, double *result);


//結構體單進單出
int ns__singleInAndOut(struct SingleIn_Out myinput,struct SingleIn_Out&myoutput);

//結構體數組
int ns__arryInAndOut(struct ArryIn_Out myinput,struct ArryIn_Out*myoutput);
           

注意結構體紅色部分,根據網上的教程 父級結構名字不要帶ns__;傳回的目标結構成員的名字必須是__ptr,大小的名字必須是__size。

VS2008 gsoap 筆記

步驟2:使用指令行soapcpp2.exe  structArrayIO.h生成先關檔案

建立空項目,添加檔案,設定工程屬性之類的步驟就不再說了和上面的一樣。

步驟3:服務端添加Server.cpp,并拷貝以下代碼。

<pre name="code" class="html">#include <stdio.h>
#include "structArrayIO.h"
#include "structArrayIO.nsmap"
#include <iostream>

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, double num1, double num2, double *sum)
{
	*sum = num1 + num2;
	printf("%lf+%lf=%lf\n",num1,num2,*sum);
	return 0;
}



//結構體
int ns__singleInAndOut(struct soap *soap,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput)
{
	//輸出傳入的結構體
	//修改結構體後傳回給用戶端
	printf("----------------client------------------------\n");
	printf("年齡%d\n",myinput.userInfo.age);
	printf("性别%d\n",myinput.userInfo.gender);
	printf("ID %d\n",myinput.userInfo.UID);
	std::cout<<"姓名"<<myinput.userInfo.name<<std::endl;

	myoutput.userInfo.age=myinput.userInfo.age+10;
	myoutput.userInfo.gender=myinput.userInfo.gender;
	myoutput.userInfo.UID=myinput.userInfo.UID+10;

	return 0;
}


//結構體數組
int ns__arryInAndOut(struct soap *soap,struct ArryIn_Out myinput,struct ArryIn_Out*myoutput)
{
	//輸出傳入的數組
	//修改結構體後傳回給用戶端
	if (myinput.__size<=0)
		return 0;

	myoutput->__size = myinput.__size; 
	myoutput->__ptr = (struct ns__user**)soap_malloc(soap,myinput.__size*sizeof(struct ns__user));  

	printf("-------------------------------------------------------\n");
	for (int cnt=0;cnt<myinput.__size;cnt++)
	{
		printf("%d\n",myinput.__ptr[cnt]->age);
		printf("%d\n",myinput.__ptr[cnt]->gender);
		printf("%d\n",myinput.__ptr[cnt]->UID);
		std::cout<<"姓名"<<myinput.__ptr[cnt]->name<<std::endl;
		printf("\n");

		myoutput->__ptr[cnt] = (struct ns__user*)soap_malloc(soap,sizeof(struct ns__user));  
		(*myoutput->__ptr[cnt]).UID=myinput.__ptr[cnt]->UID+10;  
		(*myoutput->__ptr[cnt]).age=myinput.__ptr[cnt]->age+1;
		(*myoutput->__ptr[cnt]).gender=myinput.__ptr[cnt]->gender; 
		//(*myoutput->__ptr[cnt]).name=myinput.__ptr[cnt]->name; 
		(*myoutput->__ptr[cnt]).name= soap_strdup(soap,myinput.__ptr[cnt]->name);

		printf("%d\n",myoutput->__ptr[cnt]->age);
		printf("%d\n",myoutput->__ptr[cnt]->gender);
		printf("%d\n",myoutput->__ptr[cnt]->UID);
		std::cout<<"姓名"<<myoutput->__ptr[cnt]->name<<std::endl;
		printf("\n");

	}
	return 0;
}
           

步驟4:用戶端添加Client.cpp,并拷貝以下代碼。

#include <stdio.h>
#include <stdlib.h>
#include "soapH.h"
#include "structArrayIO.nsmap"
#include <iostream>


int add(const char* server, double num1, double num2, double *sum);
int singleInAndOut(const char* server,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput);
int arryInAndOut(const char* server,struct ArryIn_Out myinput,struct ArryIn_Out*myoutput);

void testAdd(int argc, char **argv)
{
	double result = -1;
	char* server="http://localhost:8888";
	double num1 = 0;
	double num2 = 0;
	double sum = 0;
	if( argc < 3 )
	{
		printf("usage: %s num1 num2 \n", argv[0]);
		exit(0);
	}

	num1 = atof(argv[1]);
	num2 = atof(argv[2]);

	result = add(server, num1, num2, &sum);
	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("%lf+%lf=%lf\n", num1, num2, sum );
	}
}


void testSingle()
{

	char* server="http://localhost:8888";
	struct SingleIn_Out myinput;
	myinput.userInfo.age=10;
	myinput.userInfo.gender=1;
	myinput.userInfo.UID=1000;
	myinput.userInfo.name="test";

	printf("----------------begin------------------------\n");
	printf("年齡%d\n",myinput.userInfo.age);
	printf("性别%d\n",myinput.userInfo.gender);
	printf("ID %d\n",myinput.userInfo.UID);
	std::cout<<"姓名"<<myinput.userInfo.name<<std::endl;

	struct SingleIn_Out myoutput;
	double result = -1;
	result = singleInAndOut(server, myinput, myoutput);

	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("----------------return------------------------\n");
		printf("年齡%d\n",myoutput.userInfo.age);
		printf("性别%d\n",myoutput.userInfo.gender);
		printf("ID %d\n",myoutput.userInfo.UID);
		std::cout<<"姓名"<<myoutput.userInfo.name<<std::endl;
	}
}

void testArry()
{
	struct ArryIn_Out  myoutput;
	char* server="http://localhost:8888";

	std::string hhhhh="hjhj";
	myoutput.__size = 5;  
	myoutput.__ptr = (struct ns__user**)malloc(myoutput.__size*sizeof(struct ns__user));  
	myoutput.__ptr[0] = (struct ns__user*)malloc(sizeof(struct ns__user));  
	myoutput.__ptr[0]->UID=1000;  
	myoutput.__ptr[0]->age=20; 
	myoutput.__ptr[0]->gender=1;
	myoutput.__ptr[0]->name=new char[10];//( char* )malloc(10);
	strcpy(myoutput.__ptr[0]->name,"test0");

	myoutput.__ptr[1] = (struct ns__user*)malloc(sizeof(struct ns__user));  
	myoutput.__ptr[1]->UID=1001;  
	myoutput.__ptr[1]->age=21;  
	myoutput.__ptr[1]->gender=1;
	myoutput.__ptr[1]->name=new char[10];//(char*)malloc(10);
	strcpy(myoutput.__ptr[1]->name,"test1");

	myoutput.__ptr[2] = (struct ns__user*)malloc(sizeof(struct ns__user));  
	myoutput.__ptr[2]->UID=1002;  
	myoutput.__ptr[2]->age=22;  
	myoutput.__ptr[2]->gender=1;
	myoutput.__ptr[2]->name=new char[10];//(char*)malloc(10);
	strcpy(myoutput.__ptr[2]->name,"test2");

	myoutput.__ptr[3] = (struct ns__user*)malloc(sizeof(struct ns__user));  
	myoutput.__ptr[3]->UID = 1003;  
	myoutput.__ptr[3]->age=23; 
	myoutput.__ptr[3]->gender=1;
	myoutput.__ptr[3]->name=new char[10];//(char*)malloc(10);
	strcpy(myoutput.__ptr[3]->name,"test3");

	std::string temp="test4";
	myoutput.__ptr[4] = (struct ns__user*)malloc(sizeof(struct ns__user));  
	myoutput.__ptr[4]->UID = 1004;  
	myoutput.__ptr[4]->age=24;
	myoutput.__ptr[4]->gender=1;
	myoutput.__ptr[4]->name=new char[10];//(char*)malloc(10);
	strcpy(myoutput.__ptr[4]->name,temp.c_str());
	


	struct ArryIn_Out myoutput2;

	double result = -1;
	result = arryInAndOut(server, myoutput, &myoutput2);

	if (result != 0)
	{
		printf("soap err,errcode = %d\n", result);
	}
	else
	{
		printf("----------------return------------------------\n");
	}

	for (int i=0;i<myoutput.__size;i++)
	{
		//free(myoutput.__ptr[i]->name);
		delete[] myoutput.__ptr[i]->name;
		free(myoutput.__ptr[i]);
	}
	free(myoutput.__ptr);
}


int main(int argc, char **argv) 
{
	//testAdd(argc,argv);
	//testSingle();
	testArry();
	return 0;
}

int add( const char* server, double num1, double num2, double *sum )
{
	struct soap add_soap;
	int result = 0;
	soap_init(&add_soap);
	//    soap_set_namespaces(&add_soap, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__add( &add_soap, server, "", num1, num2, sum );
	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;
}

int singleInAndOut(const char* server,struct SingleIn_Out myinput,struct SingleIn_Out&myoutput)
{
	//傳入結構體
	struct soap add_soap;
	int result = 0;
	soap_init(&add_soap);
	//soap_set_namespaces(&add_soap, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__singleInAndOut( &add_soap, server, "", myinput, myoutput);
	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;
}

int arryInAndOut(const char* server,struct ArryIn_Out myinput,struct ArryIn_Out*myoutput)
{
	//傳入結構體
	struct soap add_soap;
	int result = 0;
	soap_init(&add_soap);
	//soap_set_namespaces(&add_soap, add_namespaces);

	//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_
	soap_call_ns__arryInAndOut( &add_soap, server, "", myinput, myoutput);
	printf("----------------return------------------------\n");
	for (int cnt=0;cnt<myoutput->__size;cnt++)
	{
		printf("%d\n",myoutput->__ptr[cnt]->age);
		printf("%d\n",myoutput->__ptr[cnt]->gender);
		printf("%d\n",myoutput->__ptr[cnt]->UID);
		std::cout<<"姓名"<<myoutput->__ptr[cnt]->name<<std::endl;
		printf("\n"); 
	}
	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;
}
           

步驟5:生成可執行檔案,使用指令行啟動服務端8888端口,另啟用戶端進行測試,結果如下

VS2008 gsoap 筆記

我一直沒有解釋過server和client的代碼為啥要這麼寫,其實就是依葫蘆畫瓢,你先複制黏貼。

Server.cpp  main函數的代碼可以說是不用修改的,隻要實作自己定的那些函數就行,加法操作,結構體操作,結構體數組操作。

Client.cpp相對于服務端就麻煩一點。在代碼注釋//該函數是用戶端調用的主要函數,後面幾個參數和add.h中聲明的一樣,前面多了個參數,函數名是接口函數名ns__add前面加上soap_call_  告訴了函數的調用和格式。

VS2008 gsoap 筆記

服務端用戶端的使用基本有點頭目了但還沒使用URL ,xml來傳遞資訊。

下面是我在學習和寫筆記的時候所參考的一些部落格文章先感謝各位部落客

參考連結:

WSDL 詳解 - ETTTTTSS的專欄 - 部落格頻道 - CSDN.NET

wsdl生成用戶端、wsdl接口測試及簡介(有網絡和無網絡) - 豆丁網

gSoap 伺服器和用戶端的開發 - zhangxiaonanwin的專欄 - 部落格頻道 - CSDN.NET

gsoap在windows下的應用 ----服務端(一) - danshiming的日志 - 網易部落格

win7 gsoap與vs2010 c++建立Web Service - idealing - 部落格園

onvif學習2-soap介紹以及gsoap使用 - 找尋屬于自己的瓦爾登湖 - 部落格頻道 - CSDN.NET

gSoap Visual C++ 2010_飛螞蟻哥哥_新浪部落格

VS2010下用gSoap實作簡單加法執行個體 - 走向輝煌 - 部落格頻道 - CSDN.NET

gsoap使用心得! - 浪迹天涯 - C++部落格

gsoap傳遞數組方法 - 固本培元的專欄 - 部落格頻道 - CSDN.NET

gsoap處理http post和http get - jk110333的專欄 - 部落格頻道 - CSDN.NET

基于gsoap開發WebService服務傳回結構體數組 - liang12360640的專欄 - 部落格頻道 - CSDN.NET

http://blog.csdn.net/flyfish1986/article/details/7593224 gsoap源碼分析

繼續閱讀