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

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 閱讀(2286) 評論(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>
            亚洲男女毛片无遮挡| 久久精品国产96久久久香蕉| 亚洲电影免费在线观看| 久久久成人精品| 在线国产精品播放| 亚洲国产精品久久久久秋霞蜜臀 | 一区二区三区国产盗摄| 亚洲日本成人| 国产精品女主播| 久久久国产一区二区| 久久国产精品一区二区三区| 国产综合香蕉五月婷在线| 麻豆成人av| 欧美大片在线看| 这里只有精品电影| 亚洲欧美在线播放| 精品动漫3d一区二区三区免费| 美女91精品| 欧美连裤袜在线视频| 亚洲欧美日韩久久精品| 久久av一区| 日韩视频免费| 欧美一区二区三区四区视频 | 欧美激情一区在线| 亚洲一区在线免费| 欧美怡红院视频一区二区三区| 亚洲福利国产| 一区二区不卡在线视频 午夜欧美不卡'| 国产欧美精品va在线观看| 欧美黑人在线观看| 国产精品网站在线观看| 欧美福利一区二区| 国产人成一区二区三区影院| 欧美激情 亚洲a∨综合| 国产精品丝袜白浆摸在线| 蜜桃av综合| 国产精品婷婷| 欧美激情自拍| 国产主播一区| 99视频热这里只有精品免费| 韩国久久久久| 亚洲中午字幕| 国产精品99久久久久久久女警| 欧美一区二区高清| 亚洲香蕉网站| 欧美男人的天堂| 久久综合一区| 国产亚洲精品激情久久| 在线亚洲免费| 亚洲色无码播放| 欧美精品一区二区精品网| 久久天天躁狠狠躁夜夜av| 国产精品网站在线| 一区二区三区日韩精品视频| 亚洲精品视频在线观看网站| 久久久国产91| 久久久国产视频91| 国产女人精品视频| 9色精品在线| 99国产精品| 欧美精品一线| 亚洲韩国日本中文字幕| 亚洲国产精品国自产拍av秋霞| 欧美一区二区三区在线观看| 午夜视频在线观看一区| 欧美三级视频| 亚洲网站在线播放| 亚洲一区二区影院| 国产精品久久77777| 99国产麻豆精品| 中文亚洲免费| 国产精品欧美精品| 亚洲天堂男人| 欧美一区二区播放| 国产三级欧美三级日产三级99| 亚洲伊人观看| 久久久久久久久久看片| 黄色av一区| 六十路精品视频| 亚洲缚视频在线观看| 99视频精品全部免费在线| 欧美精品大片| 亚洲午夜精品| 久久久777| 1000精品久久久久久久久| 美女精品网站| av成人免费在线观看| 亚洲欧美日产图| 国产亚洲精品高潮| 久热精品视频在线观看| 亚洲精品社区| 午夜在线精品| 亚洲电影免费观看高清完整版| 麻豆久久婷婷| 亚洲午夜成aⅴ人片| 欧美在线免费观看| 亚洲第一网站免费视频| 欧美日韩免费一区二区三区| 亚洲自拍偷拍色片视频| 欧美激情aaaa| 香蕉久久夜色精品国产| 亚洲激情女人| 国产精品无码专区在线观看| 久久天天综合| 亚洲一区二区视频在线观看| 欧美大片一区二区三区| 亚洲欧美日韩网| 亚洲电影av在线| 国产九九精品视频| 麻豆91精品| 欧美一区三区三区高中清蜜桃| 亚洲日本欧美| 久久综合精品国产一区二区三区| 99这里只有精品| 在线成人小视频| 国产欧美 在线欧美| 欧美精品尤物在线| 久久性色av| 午夜精品福利一区二区三区av| 亚洲国产精品久久91精品| 久久精品日产第一区二区三区| 中文精品99久久国产香蕉| 在线欧美日韩| 国产视频久久久久久久| 欧美日韩色婷婷| 欧美3dxxxxhd| 久久久亚洲精品一区二区三区 | 一卡二卡3卡四卡高清精品视频| 久久人人九九| 久久国产精品99国产精| 亚洲小说欧美另类社区| 亚洲精品免费看| 亚洲精品1区| 亚洲福利在线视频| 狠狠色综合日日| 国产在线拍偷自揄拍精品| 国产精品美女久久久免费 | 亚洲欧美视频在线观看| 亚洲久色影视| 亚洲精品国产视频| 亚洲福利视频一区二区| 欧美国产视频日韩| 亚洲国产aⅴ天堂久久| 欧美高清视频在线观看| 欧美国产一区二区三区激情无套| 玖玖玖免费嫩草在线影院一区| 久久婷婷丁香| 欧美大片免费久久精品三p | 亚洲网站在线看| 国产伦精品一区二区三区视频黑人| 欧美经典一区二区三区| 欧美精品久久久久久久久老牛影院| 另类国产ts人妖高潮视频| 久久久天天操| 美日韩精品免费| 欧美国产亚洲视频| 欧美日韩一区成人| 国产精品欧美日韩| 国产精品综合网站| 雨宫琴音一区二区在线| 亚洲黄色免费网站| 中文有码久久| 久久不射2019中文字幕| 女同性一区二区三区人了人一 | 欧美一区二视频| 久久一区二区精品| 欧美高清在线精品一区| 日韩亚洲精品电影| 亚洲综合日韩在线| 久久一区视频| 国产精品久久久久久久久久免费 | 亚洲一区二区三区四区中文| 亚洲欧美综合一区| 久久久久久香蕉网| 亚洲国产成人精品久久| 亚洲最新在线| 久久国产精品99精品国产| 免播放器亚洲一区| 国产精品女人久久久久久| 亚洲成色www8888| 亚洲视屏一区| 欧美不卡在线| 亚洲欧美日韩国产中文| 毛片基地黄久久久久久天堂| 国产精品福利av| 在线播放国产一区中文字幕剧情欧美| 99精品国产高清一区二区| 久久成人精品无人区| 欧美激情无毛| 午夜在线a亚洲v天堂网2018| 欧美黄色影院| 伊人久久综合| 香蕉亚洲视频| 亚洲久色影视| 麻豆精品网站| 国产欧美日韩麻豆91| 亚洲一区999| 亚洲欧洲三级| 久久这里只有精品视频首页| 国产精品日韩专区|