• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            The power of C, the power of MD

            A problem is a chance to do your best
            posts - 11, comments - 22, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            使用gSOAP開發實例(2) 股票信息服務端程序

            Posted on 2010-08-14 23:46 roy 閱讀(2266) 評論(0)  編輯 收藏 引用 所屬分類: C/C++
            電信provisioning系統中,常常需要與遠程服務器實時交換一些數據,以完成用戶的請求。由于簡單對象訪問協議(Simple Object Access Protocol, SOAP)的流行,許多涉及到第三方的應用,我們一般都比較樂意使用SOAP來開發。不過,由于可能涉及到公司的機密,本系列教程的開發實例盡量采用在網上已經公開的Web Service資源。
             
            上文已經交待了gSOAPLinux環境下的編譯方法和客戶端的實例程序,本文繼續講解其服務端程序的開發。由于不可能獲得真正的數據庫內容,我們設定的目標是,所有返回的內容都是客戶端傳入的股票代碼。
             
            首先,在gsoap-2.7/gsoap/wsdl/下創建一個stock_server目錄
            -bash-3.2$ mkdir -p stock_server
             
            改變當前路徑為stock_server
            -bash-3.2$ cd stock_server
             
            仍然使用wsdl2h生成基于純C代碼的stock.h
            -bash-3.2$ ../wsdl2h -c -o stock.h http://webservice.webxml.com.cn/WebServices/ChinaStockWebService.asmx?wsdl
             
            然后,生成服務端存根程序,并且不生成xml文件和soapServerLib.c
            -bash-3.2$ ../../bin/linux386/soapcpp2 -S -L -x stock.h
             
            **  The gSOAP code generator for C and C++, soapcpp2 release 2.7.17
            **  Copyright (C) 2000-2010, Robert van Engelen, Genivia Inc.
            **  All Rights Reserved. This product is provided "as is", without any warranty.
            **  The soapcpp2 tool is released under one of the following three licenses:
            **  GPL, the gSOAP public license, or the commercial license by Genivia Inc.
             
            Saving soapStub.h annotated copy of the input declarations
            Saving soapH.h interface declarations
            Saving soapC.c XML serializers
            Saving soapServer.c server request dispatcher
            Using ns2 service name: ChinaStockWebServiceSoap
            Using ns2 service style: document
            Using ns2 service encoding: literal
            Using ns2 service location: http://webservice.webxml.com.cn/WebServices/ChinaStockWebService.asmx
            Using ns2 schema namespace: http://WebXml.com.cn/ChinaStockWebServiceSoap
            Saving ChinaStockWebServiceSoap.nsmap namespace mapping table
            Using ns3 service name: ChinaStockWebServiceSoap12
            Using ns3 service style: document
            Using ns3 service encoding: literal
            Using ns3 service location: http://webservice.webxml.com.cn/WebServices/ChinaStockWebService.asmx
            Using ns3 schema namespace: http://WebXml.com.cn/ChinaStockWebServiceSoap12
            Saving ChinaStockWebServiceSoap12.nsmap namespace mapping table
             
            Compilation successful
             
            服務端的主程序稍微比客戶端復雜些,因為還要處理客戶端的其他請求,至少要有其函數體,否則編譯時會報錯。

            #include "soapH.h"
            #include 
            "ChinaStockWebServiceSoap12.nsmap"

            int main(int argc, char **argv) {
                
            if ( argc != 2 ) {
                    printf(
            "Usage: %s port\n", argv[0]);
                    exit(
            -1);
                }
                
            int port = atol(argv[1]);

                
            struct soap soap;
                soap_init(
            &soap);
                
            int m, s;
                
            if ( (m = soap_bind(&soap, NULL, port, 100)) < 0 ) {
                    soap_print_fault(
            &soap, stderr);
                }
                
            else {
                    printf(
            "Socket connect successfully: master socket = %d\n", m);
                    
            int i = 0;
                    
            while ( 1 ) {
                        
            if ( (s = soap_accept(&soap)) < 0 ) {
                            soap_print_fault(
            &soap, stderr);
                            
            break;
                        }
                        printf(
            "Connection %d accepted from IP = %d.%d.%d.%d, slave socket = %d\n"++i, (soap.ip >> 24& 0xff, (soap.ip >> 16& 0xff, (soap.ip >> 8& 0xff, soap.ip & 0xff, s);
                        
            if ( soap_serve(&soap) != SOAP_OK ) {
                            soap_print_fault(
            &soap, stderr);
                            
            break;
                        }
                        soap_end(
            &soap);
                    }
                }
                soap_done(
            &soap);
            }

            int __ns3__getStockInfoByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockInfoByCode *request,
                
            struct _ns1__getStockInfoByCodeResponse *response) {
                
            int element_counter = 25;
                response
            ->getStockInfoByCodeResult = (struct ns1__ArrayOfString *) malloc(sizeof(struct ns1__ArrayOfString));
                response
            ->getStockInfoByCodeResult->__sizestring = element_counter;
                response
            ->getStockInfoByCodeResult->string = (char **) malloc(sizeof(char ** element_counter);
                
            int i = 0;
                
            for ( i = 0; i < element_counter; i++ ) {
                    response
            ->getStockInfoByCodeResult->string[i] = (char *) malloc(sizeof(char* 32);
                    strcpy(response
            ->getStockInfoByCodeResult->string[i], request->theStockCode);
                }
                
            return SOAP_OK;
            }

            int __ns3__getStockImage_USCOREkByteByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImage_USCOREkByteByCode *request,
                
            struct _ns1__getStockImage_USCOREkByteByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns3__getStockImage_USCOREkByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImage_USCOREkByCode *request,
                
            struct _ns1__getStockImage_USCOREkByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns3__getStockImageByteByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImageByteByCode *request,
                
            struct _ns1__getStockImageByteByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns3__getStockImageByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImageByCode *request,
                
            struct _ns1__getStockImageByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns2__getStockInfoByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockInfoByCode *request,
                
            struct _ns1__getStockInfoByCodeResponse *response) {
                
            int element_counter = 25;
                response
            ->getStockInfoByCodeResult = (struct ns1__ArrayOfString *) malloc(sizeof(struct ns1__ArrayOfString));
                response
            ->getStockInfoByCodeResult->__sizestring = element_counter;
                response
            ->getStockInfoByCodeResult->string = (char **) malloc(sizeof(char ** element_counter);
                
            int i = 0;
                
            for ( i = 0; i < element_counter; i++ ) {
                    response
            ->getStockInfoByCodeResult->string[i] = (char *) malloc(sizeof(char* 32);
                    strcpy(response
            ->getStockInfoByCodeResult->string[i], request->theStockCode);
                }
                
            return SOAP_OK;
            }

            int __ns2__getStockImage_USCOREkByteByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImage_USCOREkByteByCode *request,
                
            struct _ns1__getStockImage_USCOREkByteByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns2__getStockImage_USCOREkByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImage_USCOREkByCode *request,
                
            struct _ns1__getStockImage_USCOREkByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns2__getStockImageByteByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImageByteByCode *request,
                
            struct _ns1__getStockImageByteByCodeResponse *response) {
                
            return SOAP_OK;
            }

            int __ns2__getStockImageByCode(
                
            struct soap *soap,
                
            struct _ns1__getStockImageByCode *request,
                
            struct _ns1__getStockImageByCodeResponse *response) {
                
            return SOAP_OK;
            }


            值得注意的是,如果項目中存在多個name space,最好把全部name space的相關方法都進行編碼,否則可能出現意想不到的錯誤:客戶端明明是調用ns3的方法,但是服務端卻使用了ns2的方法來提供服務。這一點我也比較費解,可能與wsdl本身的寫法有關。

             

            上述服務端程序的編譯命令是

            gcc -O2 -o stock_server stock_server.c soapC.c soapServer.c ../../stdsoap2.c -I../.. -L../.. -lgsoap

             

            同時,要把上文的客戶端程序修改一下,支持指定的end point,不指定end point再取默認的end point

            #include "soapH.h"
            #include 
            "ChinaStockWebServiceSoap12.nsmap"

            int main(int argc, char **argv) {
                
            if ( argc != 2 && argc != 3 ) {
                    printf(
            "Usage: %s stock_code [end_point]\n", argv[0]);
                    exit(
            -1);
                }

                
            struct soap soap;
                soap_init(
            &soap);
                soap_set_mode(
            &soap, SOAP_C_UTFSTRING);
                
            struct _ns1__getStockInfoByCode request;
                
            struct _ns1__getStockInfoByCodeResponse response;

                request.theStockCode 
            = argv[1];
                
            char *endpoint = NULL;
                
            if ( argc == 3 )
                    endpoint 
            = argv[2];
                
            if ( soap_call___ns3__getStockInfoByCode(&soap, endpoint, NULL, &request, &response) == SOAP_OK ) {
                    
            int element_counter = response.getStockInfoByCodeResult->__sizestring;
                    
            int i = 0;
                    
            for ( i = 0; i < element_counter; i++ ) {
                        
            switch ( i ) {
                            
            case 0  : printf("Stock code        : "); break;
                            
            case 1  : printf("Stock name        : "); break;
                            
            case 2  : printf("Timestamp         : "); break;
                            
            case 3  : printf("Latest price      : "); break;
                            
            case 4  : printf("Closing price T-1 : "); break;
                            
            case 5  : printf("Opening price     : "); break;
                            
            case 6  : printf("Ups and downs     : "); break;
                            
            case 7  : printf("Mininum price     : "); break;
                            
            case 8  : printf("Maxinum price     : "); break;
                            
            case 9  : printf("Amount of up/down : "); break;
                            
            case 10 : printf("Trading volume    : "); break;
                            
            case 11 : printf("Trading amount    : "); break;
                            
            case 12 : printf("Buy price         : "); break;
                            
            case 13 : printf("Sell price        : "); break;
                            
            case 14 : printf("Agency trans      : "); break;
                            
            case 15 : printf("Buy  1            : "); break;
                            
            case 16 : printf("Buy  2            : "); break;
                            
            case 17 : printf("Buy  3            : "); break;
                            
            case 18 : printf("Buy  4            : "); break;
                            
            case 19 : printf("Buy  5            : "); break;
                            
            case 20 : printf("Sell 1            : "); break;
                            
            case 21 : printf("Sell 2            : "); break;
                            
            case 22 : printf("Sell 3            : "); break;
                            
            case 23 : printf("Sell 4            : "); break;
                            
            case 24 : printf("Sell 5            : "); break;
                            
            default : break;
                        }
                        printf(
            "%s\n", response.getStockInfoByCodeResult->string[i]);
                    }
                }
                
            else {
                    soap_print_fault(
            &soap, stderr);
                }

                soap_destroy(
            &soap);
                soap_end(
            &soap);
                soap_done(
            &soap);
                
            return 0;
            }


            使服務端程序在某一高位端口下運行,比如
            -bash-3.2$ ./stock_server 6883
            Socket connect successfully: master socket = 3
             
            另起一個窗口執行客戶端程序,并且指定end point
            -bash-3.2$ ./stock sh600000 http://localhost:6883
            Stock code        : sh600000
            Stock name        : sh600000
            Timestamp         : sh600000
            Latest price      : sh600000
            Closing price T-1 : sh600000
            Opening price     : sh600000
            Ups and downs     : sh600000
            Mininum price     : sh600000
            Maxinum price     : sh600000
            Amount of up/down : sh600000
            Trading volume    : sh600000
            Trading amount    : sh600000
            Buy price         : sh600000
            Sell price        : sh600000
            Agency trans      : sh600000
            Buy  1            : sh600000
            Buy  2            : sh600000
            Buy  3            : sh600000
            Buy  4            : sh600000
            Buy  5            : sh600000
            Sell 1            : sh600000
            Sell 2            : sh600000
            Sell 3            : sh600000
            Sell 4            : sh600000
            Sell 5            : sh600000
             
            成功!

            亚洲国产精品综合久久网络| 亚洲中文字幕伊人久久无码| 久久久久久狠狠丁香| 国产免费久久精品99久久| 99久久香蕉国产线看观香| av无码久久久久久不卡网站| 久久久久无码精品国产app| 无码人妻久久久一区二区三区| 99久久精品国产麻豆| 中文成人无码精品久久久不卡| 久久精品九九亚洲精品| 亚洲午夜福利精品久久| 久久综合狠狠综合久久激情 | 久久久久久精品久久久久| 亚洲伊人久久大香线蕉苏妲己| 狠狠精品久久久无码中文字幕| 久久99精品久久久久久9蜜桃| 久久精品亚洲中文字幕无码麻豆| 日本精品久久久久影院日本| 国产美女亚洲精品久久久综合| 人妻少妇久久中文字幕一区二区| 欧美亚洲日本久久精品| 久久综合欧美成人| 久久亚洲综合色一区二区三区| 亚洲中文字幕无码一久久区| 伊人久久大香线蕉综合网站| 久久精品国产国产精品四凭| 曰曰摸天天摸人人看久久久| 久久久青草久久久青草| 国产成人综合久久综合| 精品熟女少妇av免费久久| 久久久久人妻精品一区| 久久人妻少妇嫩草AV无码专区| 国产色综合久久无码有码| 亚洲精品无码久久久久去q | 国产精品乱码久久久久久软件| 欧美久久天天综合香蕉伊| 久久无码一区二区三区少妇| 色婷婷久久久SWAG精品| 亚洲欧洲中文日韩久久AV乱码| 久久久SS麻豆欧美国产日韩|