青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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 閱讀(2278) 評論(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
 
成功!

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲一区在线观看视频| 嫩草影视亚洲| 国产欧美日韩在线| 国产精品福利久久久| 欧美大片在线看| 欧美福利在线观看| 亚洲国产天堂久久国产91| 亚洲人成网站精品片在线观看| 欧美日韩精品在线视频| 久久精品视频在线| 亚洲国产va精品久久久不卡综合| 99riav国产精品| 快播亚洲色图| 欧美精品一区二区视频 | 麻豆成人精品| 欧美一级淫片播放口| 激情久久久久久| 99国产精品私拍| 新狼窝色av性久久久久久| 久久久精品国产99久久精品芒果| 亚洲精品日韩久久| 一区二区欧美日韩视频| 亚洲毛片一区| 久久精品99国产精品酒店日本| 免费成人小视频| 欧美高清视频一区二区三区在线观看| 欧美成人xxx| 日韩视频不卡| 日韩视频第一页| 欧美日韩国产va另类| 国产一区欧美日韩| 尤物99国产成人精品视频| 在线成人中文字幕| 亚洲午夜高清视频| 99精品欧美一区| 欧美黑人在线播放| 欧美一区二区三区久久精品| 亚洲综合色自拍一区| 久久成人亚洲| 欧美亚男人的天堂| 日韩一区二区精品视频| 欧美激情一区二区久久久| 亚洲欧美国产一区二区三区| 欧美理论电影网| 国产精品久久久久aaaa| 久久嫩草精品久久久久| 99精品免费网| 久久精品人人做人人综合| 欧美成人免费网| 国产一区二区三区在线观看视频 | 噜噜噜噜噜久久久久久91| 欧美在线一二三| 在线观看视频欧美| 噜噜噜91成人网| 久久国产精品99精品国产| 欧美午夜宅男影院在线观看| 久久久久久69| 欧美在线视频免费| 国产日韩欧美三级| 久久国产精品久久国产精品| 亚洲一区二区在线免费观看视频| 欧美日韩国产电影| 亚洲一区自拍| 亚洲精品日韩在线| 亚洲精品欧美| 精品91在线| 亚洲美女黄网| 国产精品久久久久久久7电影| 亚洲另类视频| 欧美亚洲三区| 在线精品在线| 亚洲一区二区三区在线播放| 国产精品久久久久久久久久直播| 欧美激情女人20p| 欧美丝袜一区二区| 欧美一区二区三区四区夜夜大片| 久久精品国产亚洲精品| 亚洲欧美日产图| 免费在线视频一区| 亚洲与欧洲av电影| 亚洲视频福利| 亚洲第一区在线| 一区二区三区黄色| 一区二区视频欧美| 午夜影院日韩| 久久免费高清| 国产一区二区三区电影在线观看 | 欧美影院一区| 欧美成人精精品一区二区频| 国产综合色精品一区二区三区| 免费成人av在线| 永久免费毛片在线播放不卡| 欧美在线日韩| 久久精品国产免费| 国产麻豆一精品一av一免费| 亚洲网址在线| 欧美伊久线香蕉线新在线| 一级成人国产| 亚洲人成亚洲人成在线观看| 欧美日韩高清免费| 亚洲欧美视频| 久久久久久夜| 国产主播一区二区三区| 欧美性片在线观看| 国产精品va在线播放| 久久精品91| 性欧美xxxx大乳国产app| 欧美日韩免费精品| 亚洲桃花岛网站| 欧美激情在线狂野欧美精品| 午夜免费在线观看精品视频| 亚洲国产第一| 在线日韩成人| 国产亚洲成av人在线观看导航| 美女在线一区二区| 欧美影院在线播放| 亚洲欧美一区二区三区在线 | 国产精品久久久久久影视 | 国产色婷婷国产综合在线理论片a| 国产酒店精品激情| 久久免费精品日本久久中文字幕| 欧美成人在线影院| 欧美激情一区二区三区全黄| 欧美在线视频不卡| 日韩视频―中文字幕| 国产精品久久久久7777婷婷| 一区二区高清视频| 老鸭窝毛片一区二区三区 | 亚洲欧洲一区二区天堂久久| 欧美日韩一区二| 欧美日韩亚洲视频一区| 国产精品成人一区二区三区吃奶 | 亚洲欧洲av一区二区| 久久精品91久久久久久再现| 久久精品国产精品亚洲综合| 欧美一级欧美一级在线播放| 亚洲综合日韩| 久久精品99国产精品酒店日本| 99re8这里有精品热视频免费 | 亚洲欧美在线观看| 亚洲一级影院| 久久一区二区三区av| 99精品视频免费观看| 亚洲韩国青草视频| 一本色道久久综合精品竹菊| 久久国产精品亚洲va麻豆| 香蕉亚洲视频| 欧美区视频在线观看| 欧美三级不卡| 亚洲日韩成人| 久久综合精品一区| 一道本一区二区| 欧美一区二区三区在线观看 | 亚洲在线视频网站| 亚洲一区二区三区色| 久久精品夜色噜噜亚洲aⅴ| 国产精品久久久久久超碰| 国产精品99久久久久久久久久久久 | 亚洲日韩成人| 亚洲欧美变态国产另类| 欧美日韩国产首页| 99国产精品99久久久久久| 亚洲在线电影| 亚洲精品一区二区三区樱花| 久久这里有精品视频| 狠狠色香婷婷久久亚洲精品| 久久综合久久美利坚合众国| 一区二区三区四区国产| 欧美巨乳在线| 欧美中文在线字幕| 久久精品亚洲精品| 国产精品日韩欧美一区| 一区二区三区四区五区精品视频| 欧美成人免费在线视频| 欧美大片免费观看| 制服诱惑一区二区| 亚洲第一页自拍| 国产精品久久久久久久久果冻传媒 | 男男成人高潮片免费网站| 亚洲国产日韩美| 欧美国产日韩精品| 久久久久久久久蜜桃| 欧美91大片| 老司机成人网| 欧美激情一区二区三区蜜桃视频| 亚洲婷婷综合久久一本伊一区| 久久久99国产精品免费| 午夜激情亚洲| 欧美h视频在线| 久久精品一本| 国产一区二区按摩在线观看| 在线一区二区视频| 国产一区自拍视频| 亚洲欧洲一区二区三区| 亚洲一区尤物| 亚洲黄色大片| 欧美精品亚洲二区| 亚洲破处大片| 亚洲精品三级| 中文国产一区|