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

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 閱讀(2279) 評論(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| 欧美一区二区成人| 新狼窝色av性久久久久久| 欧美日韩国产综合视频在线| 欧美电影在线观看| 欲色影视综合吧| 久久久久国产精品厨房| 久久精品在线观看| 国产欧美一区二区三区另类精品| 99精品热视频| 亚洲尤物精选| 欧美香蕉大胸在线视频观看| 亚洲精品一区二区三区在线观看 | 亚洲精品国产精品国产自| 欧美精品激情blacked18| 午夜精品久久久久久99热软件| 欧美一区二区三区在线免费观看| 欧美另类videos死尸| 男人的天堂亚洲在线| 亚洲电影免费观看高清| 能在线观看的日韩av| 亚洲国产高清在线| 一区二区不卡在线视频 午夜欧美不卡在 | 日韩午夜在线观看视频| 欧美成人福利视频| 亚洲经典在线看| av成人手机在线| 国产精品国产一区二区| 亚洲综合色噜噜狠狠| 久久激情综合网| 亚洲福利视频免费观看| 美女尤物久久精品| 亚洲精品久久久一区二区三区| 一区二区国产日产| 国产伦一区二区三区色一情| 欧美一区二区成人| 亚洲电影免费在线观看| 亚洲综合精品四区| 国产综合婷婷| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲激情网站| 欧美亚洲在线| 亚洲国产精品一区| 国产精品v欧美精品∨日韩| 欧美一区二区视频观看视频| 欧美ed2k| 亚洲欧美亚洲| 亚洲国产成人久久综合一区| 欧美日韩精品在线视频| 午夜亚洲一区| 亚洲日本乱码在线观看| 欧美在线观看你懂的| 亚洲三级色网| 国模精品一区二区三区| 欧美国产视频一区二区| 午夜欧美精品| 亚洲毛片播放| 免费观看一区| 亚洲欧美日韩综合一区| 亚洲欧洲偷拍精品| 国产精品网站一区| 欧美精品高清视频| 久久精品视频一| 亚洲综合色丁香婷婷六月图片| 欧美激情视频一区二区三区不卡| 午夜亚洲性色视频| 一区电影在线观看| 久久久久久婷| 久久这里只有精品视频首页| 一区二区三区在线视频免费观看| 久久蜜桃精品| 亚洲欧洲一区| 性欧美大战久久久久久久久| 国产欧美日韩一区二区三区在线观看| 欧美顶级艳妇交换群宴| 亚洲色诱最新| 亚洲乱码视频| 亚洲人成欧美中文字幕| 一区在线视频| 国产真实乱偷精品视频免| 国产精品美女黄网| 欧美日韩日日夜夜| 欧美精品久久久久久久免费观看 | 夜夜嗨av色综合久久久综合网| 欧美国产亚洲精品久久久8v| 久久精选视频| 欧美一区二区三区视频在线观看 | 91久久精品美女高潮| 蜜桃久久精品乱码一区二区| 久久精品在线播放| 久久超碰97人人做人人爱| 亚洲午夜精品久久久久久浪潮| 亚洲狼人综合| 亚洲免费高清| 一本色道久久综合亚洲91| 亚洲日本中文字幕免费在线不卡| …久久精品99久久香蕉国产 | 亚洲国产视频一区二区| 亚洲国产欧美久久| 亚洲成人在线免费| 久久久久久欧美| 久久黄色影院| 久久网站免费| 欧美大秀在线观看| 亚洲高清电影| 亚洲精品综合在线| 日韩一区二区福利| 亚洲视频你懂的| 亚洲在线成人精品| 羞羞视频在线观看欧美| 久久精品一区二区三区四区| 久久先锋影音av| 嫩草影视亚洲| 欧美午夜电影在线| 国产欧美日韩精品丝袜高跟鞋 | 亚洲美女色禁图| 美女视频一区免费观看| 性久久久久久| 亚洲午夜在线| 亚洲六月丁香色婷婷综合久久| 久久国产精品毛片| 亚洲你懂的在线视频| 亚洲欧美日韩中文在线制服| 久久国产欧美日韩精品| 巨乳诱惑日韩免费av| 欧美另类一区二区三区| 国产精品女人毛片| 精品动漫3d一区二区三区免费| 91久久精品一区| 亚洲欧美国产视频| 久久深夜福利免费观看| 亚洲日本成人网| 亚洲欧美一级二级三级| 久久综合伊人| 国产精品系列在线播放| 亚洲国产99精品国自产| 亚洲综合成人婷婷小说| 久久亚洲精品伦理| 99国产精品国产精品毛片| 欧美一区二区三区四区在线观看| 老鸭窝亚洲一区二区三区| 国产精品免费福利| 亚洲国产另类精品专区| 亚洲欧美在线x视频| 欧美xart系列高清| 亚洲欧美色婷婷| 欧美电影免费观看高清完整版| 国产精品一香蕉国产线看观看| 亚洲国产日本| 久久久久久久久伊人| 亚洲免费电影在线观看| 久久一区二区三区四区五区| 欧美亚日韩国产aⅴ精品中极品| 在线看一区二区| 久久国产66| 国产精品99久久99久久久二8| 久久最新视频| 韩日视频一区| 性欧美长视频| 一本色道久久综合狠狠躁篇的优点| 久久精品视频免费播放| 国产精品一区二区男女羞羞无遮挡| 亚洲欧洲一区二区在线播放| 欧美主播一区二区三区美女 久久精品人 | 国产精品免费一区二区三区观看| 亚洲精品美女91| 久久伊人亚洲| 午夜欧美精品久久久久久久| 国产精品v片在线观看不卡| 亚洲毛片一区| 亚洲国产日日夜夜| 久久综合网hezyo| 激情久久一区| 老牛嫩草一区二区三区日本| 亚洲欧美视频在线| 国产伦精品一区二区三区在线观看| 国产精品99久久99久久久二8| 亚洲欧洲精品一区二区三区| 女生裸体视频一区二区三区| 亚洲国产aⅴ天堂久久| 免费在线观看精品| 玖玖视频精品| 欧美成人免费全部观看天天性色| 美女爽到呻吟久久久久| 国产亚洲一级高清| 亚洲女爱视频在线| 亚洲国产精品久久人人爱蜜臀 | 久久综合九色综合欧美就去吻| 羞羞视频在线观看欧美|