生活随笔
收集整理的這篇文章主要介紹了
linux下gsoap的初次使用 (c)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
這兩天,接到一個(gè)項(xiàng)目,需要在linux程序中調(diào)用遠(yuǎn)程的web應(yīng)用,通過soap協(xié)議。開始上網(wǎng)查了下資料,發(fā)現(xiàn)了gsoap庫這個(gè)好東東^_^。繼續(xù)在網(wǎng)上搜索例子代碼,發(fā)現(xiàn)基本都不可編譯通過,于是便一邊學(xué)習(xí)一邊寫了這個(gè)最簡單的例子,希望對后來者起到一點(diǎn)幫助。
- 對gsoap的簡單介紹,請自己參閱http://gsoap2.sourceforge.net/
??? 下載相應(yīng)的包,主要有2個(gè)工具和源代碼:
????wsdl2h -o outfile.h infile.wsdl 實(shí)現(xiàn)wsdl文件到h文件的數(shù)據(jù)映射
? ? ? ??soapcpp2 -c outfile.h生成相應(yīng)的底層通信stub,strech程序
- 下面這個(gè)簡單的例子實(shí)現(xiàn)的是在客戶端輸入2個(gè)數(shù)字,然后遠(yuǎn)程調(diào)用服務(wù)端的加法函數(shù),最后返回結(jié)果給客戶端。
??? 在這里我們不需要wsdl的文件,可以直接從.h文件來生成代碼。我們定義一個(gè)函數(shù)聲明文件,用來定義接口函數(shù),名稱為add.h,內(nèi)容如下:
add?http:int?ns2__add(?int?num1,?int?num2,?int*?sum?);
然后我們執(zhí)行soapcpp2 -c add.h,自動(dòng)生成一些遠(yuǎn)程調(diào)用需要的文件。
接下來我們寫一個(gè)服務(wù)端,創(chuàng)建文件addserver.c
#include?"soapH.h"#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;}
我們接著寫客戶端,文件addclient.c
#include?"soapStub.h"#include?"add.nsmap"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;}
最后寫一個(gè)測試代碼,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;}
到此為止,我們自己的代碼已經(jīng)編寫完畢,現(xiàn)在我們來編譯服務(wù)端和客戶端
注意:編譯的時(shí)候我們需要gsoap包里的源代碼文件,把stdsoap2.c和stdsoap2.h文件拷貝到當(dāng)前目錄
我們寫一個(gè)Makefile文件:
GSOAP_ROOT?=?/root/gsoap-2.7/gsoapWSNAME?=?addCC?=?g++?-g?-DWITH_NONAMESPACESINCLUDE?=?-I$(GSOAP_ROOT)SERVER_OBJS?=?soapC.o?stdsoap2.o?soapServer.o?$(WSNAME)server.o?CLIENT_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
然后我們執(zhí)行make,即可生產(chǎn)addserver程序;make client,生成addtest程序。
讓server跑起來,執(zhí)行./addserver 6666
終端打印出“Socket connection successful: master socket = 3”,那么你的server已經(jīng)在前臺(tái)run起來了;
運(yùn)行客戶端,./addtest ip:port num1 num2,返回加法的結(jié)果。
OK,一個(gè)最簡單的soap調(diào)用的例子完成了,進(jìn)深一步的學(xué)習(xí)請參考http://gsoap2.sourceforge.net/
from:http://blog.csdn.net/jinpw/article/details/3346844
總結(jié)
以上是生活随笔為你收集整理的linux下gsoap的初次使用 (c)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。