日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux下gsoap的初次使用 (c)

發布時間:2023/12/10 linux 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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,內容如下:

  • //gsoapopt?cw
  • //gsoap?ns2?schema?namespace:?urn:add
  • //gsoap?ns2?schema?form:?unqualified
  • //gsoap?ns2?service?name:?add
  • //gsoap?ns2?service?type:?addPortType
  • //gsoap?ns2?service?port:http://websrv.cs.fsu.edu/~engelen/addserver.cgi
  • //gsoap?ns2?service?namespace:?urn:add
  • //gsoap?ns2?service?transport:?http://schemas.xmlsoap.org/soap/http
  • //gsoap?ns2??service?method-style:??????add?rpc
  • //gsoap?ns2??service?method-encoding:???
  • add?http://schemas.xmlsoap.org/soap/encoding/
  • //gsoap?ns2??service?method-action:?????add?""
  • 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/gsoap
  • WSNAME?=?add
  • CC?=?g++?-g?-DWITH_NONAMESPACES
  • INCLUDE?=?-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.o
  • all:?server
  • server:?$(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。