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