乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      Linux下用gSOAP開發(fā)Web Service服務(wù)端和客戶端程序

       我的工作記錄 2012-08-06
       網(wǎng)上本有一篇流傳甚廣的C版本的,我參考來(lái)實(shí)現(xiàn),發(fā)現(xiàn)有不少問(wèn)題,現(xiàn)在根據(jù)自己的開發(fā)經(jīng)驗(yàn)將其修改,使用無(wú)誤;另外,補(bǔ)充同樣功能的C++版本,我想這個(gè)應(yīng)該更有用,因?yàn)槟苡肅++,當(dāng)然好過(guò)受限于C。

      1、gSOAP的安裝:

      http:///projects/gsoap2/去下載最新版本,目前是:2.7.15

      簡(jiǎn)單安裝:

      configure --prefix=/usr/local/gSOAP

             make

             make install

      為了后面的C和C++版本的服務(wù)和客戶端的開發(fā)能夠脫離源代碼目錄,最好還要如下處理:

      (1)將源代碼目錄下gsoap子目錄中的import目錄拷貝到gSOAP目錄下來(lái);

      (2)gSOAP目錄下建一個(gè)env目錄,將gsoap/samples/link下的所有文件拷貝過(guò)來(lái),并且生成envC.o(C版本要用到),方法是:

      /usr/local/gSOAP/bin/soapcpp2 -penv -c env.h

      g++ -c -I /usr/local/gSOAP/include envC.c

      (3)gSOAP目錄下建一個(gè)src目錄,將將源代碼目錄下gsoap子目錄中的stdsoap*.*拷貝過(guò)來(lái)。

       

      2、功能說(shuō)明:

             要開發(fā)的Web Service功能非常簡(jiǎn)單,就是一個(gè)add函數(shù),將兩個(gè)參數(shù)相加,返回其和。

      3、C版本的程序:

      (1)頭文件:SmsWBS.h

      //gsoap ns service name: SmsWBS
      //gsoap ns service style: rpc
      //gsoap ns service namespace: http://192.168.1.88:9000/SmsWBS.wsdl
      //gsoap ns service location: http://192.168.1.88:9000
      //gsoap ns service encoding: encoded
      //gsoap ns schema namespace: urn:SmsWBS

      int ns__add(int num1, int num2, int *sum);
      這個(gè)頭文件需要注意的是,前面的 // 部分是有意義的,可以在上面修改,如果完全去掉,將會(huì)導(dǎo)致生成的中間文件不同,由此會(huì)引起要修改Makefile文件                                           

      (2)Makefile文件:

      比較關(guān)鍵,如果頭文件中的 // 部分有修改,要檢查是否要修改Makefile文件

      GSOAP_ROOT=/usr/local/gSOAP
      WSNAME0=soap
      WSNAME=SmsWBS
      CC=g++ -g -DWITH_NONAMESPACES
      INCLUDE=-I $(GSOAP_ROOT)/include
      SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)Server.o stdsoap2.o
      CLIENT_OBJS=$(GSOAP_ROOT)/env/envC.o $(WSNAME0)ClientLib.o stdsoap2.o
      ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)Server.o ${WSNAME}test.o $(WSNAME0)ClientLib.o
      #GSOAP_SRC=/usr/local/gsoap-2.7/gsoap

      all:server

      ${WSNAME}.wsdl:${WSNAME}.h
              $(GSOAP_ROOT)/bin/soapcpp2 -c $(GSOAP_ROOT)/import ${WSNAME}.h

      stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.c
              $(CC) -c $? $(INCLUDE)

      $(ALL_OBJS):%.o:%.c
              $(CC) -c $? $(INCLUDE)

      server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
              $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

      client:Makefile ${WSNAME}.wsdl ${WSNAME}test.c $(ALL_OBJS) stdsoap2.o
              $(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test

      clean:
              rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.c $(WSNAME0)Server.c $(WSNAME0)Client.c $(WSNAME0)Stub.* $(WSNAME)$(WSNAME)Proxy.* $(WSNAME)$(WSNAME)Object.* $(WSNAME0)ServerLib.c $(WSNAME0)ClientLib.c $(WSNAME)server ns.xsd $(WSNAME)test

       

      (3)服務(wù)端程序SmsWBSserver.c:

      #include "soapH.h"
      #include "SmsWBS.nsmap"

      int main(int argc, char **argv)
      {
              int m, s;               /* master and slave sockets */
              struct soap SmsWBS_soap;

              soap_init(&SmsWBS_soap);

              soap_set_namespaces(&SmsWBS_soap, namespaces);

              if (argc < 2)
              {
                      printf("usage: %s <server_port> \n", argv[0]);
                      exit(1);
              }
              else
              {
                      m = soap_bind(&SmsWBS_soap, NULL, atoi(argv[1]), 100);
                      if (m < 0)
                      {
                              soap_print_fault(&SmsWBS_soap, stderr);
                              exit(-1);
                      }

                      fprintf(stderr, "Socket connection successful: master socket = %d\n", m);

                      for (;;)
                      {
                              s = soap_accept(&SmsWBS_soap);

                              if (s < 0)
                              {
                                      soap_print_fault(&SmsWBS_soap, stderr);
                                      exit(-1);
                              }

                              fprintf(stderr, "Socket connection successful: slave socket = %d\n", s);
                              soap_serve(&SmsWBS_soap);
                              soap_end(&SmsWBS_soap);
                      }

             }

              return 0;
      }

      int ns__add(struct soap *add_soap, int num1, int num2, int *sum)
      {
              *sum = num1 + num2;
              return 0;
      }

       

      (4)客戶端程序SmsWBStest.c:

      #include <stdio.h>
      #include <stdlib.h>
      #include "soapStub.h"
      #include "SmsWBS.nsmap"

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

      int add(const char *server, int num1, int num2, int *sum)
      {
              struct soap SmsWBS_soap;
              int result = 0;

              soap_init(&SmsWBS_soap);
              soap_set_namespaces(&SmsWBS_soap, namespaces);

              soap_call_ns__add(&SmsWBS_soap, server, "", num1, num2, sum);

              if(SmsWBS_soap.error)
              {
                      printf("soap error:%d, %s, %s ", SmsWBS_soap.error, *soap_faultcode(&SmsWBS_soap), *soap_faultstring(&SmsWBS_soap));
                      result = SmsWBS_soap.error;
               }

              soap_end(&SmsWBS_soap);
              soap_done(&SmsWBS_soap);

              return result;
      }

      int main(int argc, char **argv)
      {
              int result = -1;
              char* server="http://localhost:9000";

              int num1 = 0;
              int num2 = 0;
              int sum = 0;

              if( argc < 3 )
              {
                      printf("usage: %s num1 num2 \n", argv[0]);
                      exit(0);

              }

              num1 = atoi(argv[1]);
              num2 = atoi(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;
      }

      (5)編譯和運(yùn)行:

      前面都已經(jīng)準(zhǔn)備好了,現(xiàn)在只需要:

      make                                     ---得到服務(wù)端程序SmsWBSserver

      make client                            ---得到客戶端程序SmsWBStest

      SmsWBSserver 9000             ----運(yùn)行服務(wù)端程序

      出來(lái)類似下面的顯示就表示運(yùn)行正常

      Socket connection successful: master socket = 3

      再運(yùn)行客戶端程序:

      SmsWBStest 67 78

      顯示:

      67 + 78 = 145

      調(diào)用Web Service成功

       

      續(xù)(二)

      接(一)

       4、C++版本的程序:

      (1)頭文件不變,還是SmsWBS.h

      (2)Makefile文件:

      GSOAP_ROOT=/usr/local/gSOAP
      WSNAME0=soap
      WSNAME=SmsWBS
      CC=g++ -g -DWITH_NONAMESPACES
      INCLUDE=-I $(GSOAP_ROOT)/include
      SERVER_OBJS=$(WSNAME0)C.o $(WSNAME0)$(WSNAME)Service.o stdsoap2.o
      CLIENT_OBJS=$(WSNAME0)$(WSNAME)Proxy.o $(WSNAME0)C.o stdsoap2.o
      ALL_OBJS=${WSNAME}server.o $(WSNAME0)C.o $(WSNAME0)$(WSNAME)Service.o $(WSNAME0)$(WSNAME)Proxy.o ${WSNAME}test.o
      #GSOAP_SRC=/usr/local/gsoap-2.7/gsoap

      all:server

      ${WSNAME}.wsdl:${WSNAME}.h
              $(GSOAP_ROOT)/bin/soapcpp2 -i $(GSOAP_ROOT)/import ${WSNAME}.h

      stdsoap2.o:$(GSOAP_ROOT)/src/stdsoap2.cpp
              $(CC) -c $? $(INCLUDE)

      $(ALL_OBJS):%.o:%.cpp
              $(CC) -c $? $(INCLUDE)

      server:Makefile ${WSNAME}.wsdl ${WSNAME}server.o $(SERVER_OBJS)
              $(CC) ${WSNAME}server.o $(SERVER_OBJS) -o ${WSNAME}server

      client:Makefile ${WSNAME}.wsdl ${WSNAME}test.cpp $(ALL_OBJS) stdsoap2.o
              $(CC) ${WSNAME}test.o $(CLIENT_OBJS) -o ${WSNAME}test

      clean:
              rm -f *.o *.xml *.a *.wsdl *.nsmap $(WSNAME0)H.h $(WSNAME0)C.cpp $(WSNAME0)Server.cpp  $(WSNAME0)Stub.* $(WSNAME0)$(WSNAME)S
      ervice.* $(WSNAME0)$(WSNAME)Proxy.* $(WSNAME0)$(WSNAME)Object.* $(WSNAME0)ServerLib.cpp $(WSNAME0)ClientLib.cpp $(WSNAME)server ns.x
      sd $(WSNAME)test

      (3)服務(wù)端程序SmsWBSserver.cpp:

      #include "soapSmsWBSService.h"
      #include "SmsWBS.nsmap"

      int main(int argc, char **argv)
      {
       SmsWBSService sms;

       if (argc < 2)
        sms.serve();       /* serve as CGI application */
       else
       {
        int port = atoi(argv[1]);

        if (!port)
        {
         fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
         exit(0);
        }

        /* run iterative server on port until fatal error */
        if (sms.run(port))
        {
         sms.soap_stream_fault(std::cerr);
         exit(-1);
        }
       }

       return 0;
      }

      int SmsWBSService::add(int num1, int num2, int *sum)
      {
       *sum = num1 + num2;
       return SOAP_OK;
      }

      (4)客戶端程序SmsWBStest.cpp:

      #include <stdio.h>
      #include <stdlib.h>
      #include "soapSmsWBSProxy.h"
      #include "SmsWBS.nsmap"

      int main(int argc, char **argv)
      {
              int result = -1;
              char* server="http://localhost:9000";

              int num1 = 0;
              int num2 = 0;
              int sum = 0;

              if( argc < 3 )
              {
                      printf("usage: %s num1 num2 \n", argv[0]);
                      exit(0);
              }

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

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

              return 0;
      }

      (5)編譯運(yùn)行,與C版本類似,只是服務(wù)端運(yùn)行時(shí)沒(méi)有提示信息

      續(xù)(三)

      接(二)

      5、方便其它平臺(tái)調(diào)用Web Service服務(wù)所需要做的工作:

      以上的C和C++版本的Web Service服務(wù)端運(yùn)行后,在本機(jī)或者其它機(jī)(windows系統(tǒng)也一樣)瀏覽器中輸入http://192.168.1.88:9000/SmsWBS?wsdl,會(huì)返回XML文件內(nèi)容,但是并無(wú)Web Service的功能函數(shù)描述,原因是尚未實(shí)現(xiàn)允許客戶端通過(guò)http的get操作來(lái)獲取 SmsWBS.wsdl文件。因此,需要補(bǔ)充實(shí)現(xiàn)這一部分,以C++版本為例,完善后的SmsWBSserver.cpp程序是:

      #include "soapSmsWBSService.h"
      #include "SmsWBS.nsmap"

      int http_get(struct soap * soap);

      int main(int argc, char **argv)
      {
       SmsWBSService sms;

       if (argc < 2)
        sms.serve();       /* serve as CGI application */
       else
       {
        int port = atoi(argv[1]);

        if (!port)
        {
         fprintf(stderr, "Usage: SmsWBSserver++ <port>\n");
         exit(0);
        }

        /* run iterative server on port until fatal error */
        sms.fget = http_get;

        if (sms.run(port))
        {
         sms.soap_stream_fault(std::cerr);
         exit(-1);
        }
       }

       return 0;
      }

      int SmsWBSService::add(int num1, int num2, int *sum)
      {
       *sum = num1 + num2;
       return SOAP_OK;
      }

      //能夠遠(yuǎn)程讀取wsdl文件
      int http_get(struct soap * soap)
      {
       FILE *fd = NULL;

       char *s = strchr(soap->path, '?');
       if (!s || strcmp(s, "?wsdl"))
        return SOAP_GET_METHOD;

       fd = fopen("SmsWBS.wsdl", "rb");

       if (!fd)
        return 404;

       soap->http_content = "text/xml";

       soap_response(soap, SOAP_FILE);

       for (;;)
       {
       size_t r = fread(soap->tmpbuf, 1, sizeof(soap->tmpbuf), fd);
       if (!r)
         break;
       if (soap_send_raw(soap, soap->tmpbuf, r))
         break;
       }

       fclose(fd);
       soap_end_send(soap);

       return SOAP_OK;
      }


      重新將服務(wù)端編譯,運(yùn)行后http://192.168.1.88:9000/SmsWBS?wsdl能夠獲取到完整的SmsWBS.wsdl。

      至此,可以在windows下的VC++.Net項(xiàng)目中通過(guò)“添加WEB 引用”來(lái)方便地生成客戶端類文件,從而調(diào)用Web Service服務(wù)端的功能。

       (全文完)

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多