gsoap --- qq狀態(tài)查詢(xún)程序

一苛吱、gSoap簡(jiǎn)介

1.1匾乓、soap協(xié)議

介紹gsoap需要先了解soap協(xié)議,soap名叫簡(jiǎn)單對(duì)象訪(fǎng)問(wèn)協(xié)議又谋,是交換數(shù)據(jù)的一種協(xié)議規(guī)范拼缝。其特點(diǎn)是輕量、簡(jiǎn)單彰亥、基于XML咧七,它被設(shè)計(jì)成在WEB上交換結(jié)構(gòu)化和固化的信息。
  SOAP采用了已經(jīng)廣泛使用的兩個(gè)協(xié)議:HTTP和XML(遵循標(biāo)記語(yǔ)言的下一個(gè)子集)任斋。HTTP用于實(shí)現(xiàn)SOAP的RPC風(fēng)格的傳輸继阻,而XML是它的編碼模式。采用幾行代碼和XML解析器废酷,HTTP服務(wù)器(IIS或者Apache)成為SOAP的ORBS瘟檩。SOAP通訊協(xié)議采用HTTP來(lái)發(fā)送XML格式的信息。HTTP與RPC的協(xié)議很相似澈蟆,他簡(jiǎn)單配置廣泛墨辛,并且對(duì)防火墻比其他協(xié)議更容易發(fā)揮作用。HTTP請(qǐng)求一般由Web服務(wù)器軟件(IIS和Apache)來(lái)處理趴俘,但越來(lái)越多的應(yīng)用服務(wù)器產(chǎn)品正在支持HTTP睹簇。XML作為一個(gè)更好的網(wǎng)絡(luò)數(shù)據(jù)表達(dá)方式(NDR)擎椰。SOAP把XML的使用代碼化為請(qǐng)求和響應(yīng)參數(shù)編碼模式朗若,并用HTTP作傳輸。具體的講级遭,一個(gè)SOAP方法可以簡(jiǎn)單地看作遵循SOAP編碼規(guī)則的HTTP請(qǐng)求和響應(yīng)疲憋,一個(gè)SOAP終端可以看作一個(gè)基于HTTP的URL凿渊,它用來(lái)識(shí)別方法調(diào)用的目標(biāo)。像CORBA/IIOP一樣缚柳,SOAP不需要具體的對(duì)象綁定到一個(gè)給定的終端埃脏,而是由具體的實(shí)現(xiàn)程序來(lái)決定怎樣把對(duì)象終端標(biāo)識(shí)符映像到服務(wù)器端對(duì)象。

1.2喂击、gSoap工具

gSoap就是一個(gè)工具剂癌,提供一個(gè)SOAP/XML關(guān)于C/C++語(yǔ)言的實(shí)現(xiàn)淤翔,從而讓C/C++語(yǔ)言開(kāi)發(fā)web服務(wù)或者客戶(hù)端程序的工作變得輕松了很多翰绊。絕大多數(shù)的C++ web服務(wù)工具包提供一組API函數(shù)類(lèi)庫(kù)來(lái)處理特定的SOAP數(shù)據(jù)結(jié)構(gòu),這樣就使得用戶(hù)必須改變程序結(jié)構(gòu)來(lái)適應(yīng)相關(guān)類(lèi)庫(kù)。與之相反监嗜,gSoap利用編譯器技術(shù)提供了一組透明化的SOAP API谐檀,并將與開(kāi)發(fā)無(wú)關(guān)的SOAP實(shí)現(xiàn)細(xì)節(jié)相關(guān)的內(nèi)容對(duì)用戶(hù)隱藏起來(lái)。

二裁奇、gSoap環(huán)境準(zhǔn)備

首先電腦上要具備相關(guān)的環(huán)境桐猬,這里我在ubuntu14.04下進(jìn)行嘗試,嘗試之前要安裝很多東西以免發(fā)生編譯錯(cuò)誤:

sudo apt-get install build-essential flex bison openssl libssl-dev libssl0.9.8 checkinstall libgtk2.0-dev libglib2.0-dev
https://sourceforge.net/projects/gsoap2/files/gSOAP

可以看到還是需要安裝很多很多的東西的刽肠,不然編譯會(huì)報(bào)各種錯(cuò)溃肪。下載的是最新版本的gSOAP 2.8 ,該軟件是基于GPL V2進(jìn)行開(kāi)源的音五。使用時(shí)候注意相關(guān)規(guī)范。將下載下來(lái)的代碼進(jìn)行解壓躺涝。按照下面過(guò)程進(jìn)行配置和編譯厨钻。

./configure
make
make install

中間在make的時(shí)候可能還有遇到有其他問(wèn)題坚嗜,這里就可以直接百度看看是不是環(huán)境中卻什么包。安裝上后如果編譯還是有問(wèn)題苍蔬,可以嘗試 make clean && make distclean 兩條命令執(zhí)行后再進(jìn)行配置和編譯操作。

以下是一個(gè)Makefile文件碟绑,需要將其單獨(dú)放在一個(gè)空文件夾中,進(jìn)行測(cè)試:

聲明:這個(gè)Makefile 來(lái)自 chinaunix大神 “chenshko” 轉(zhuǎn)載文章蜈敢,原文章出現(xiàn)在百度貼吧中辜荠,現(xiàn)在網(wǎng)頁(yè)已經(jīng)打不開(kāi)了伯病,很抱歉這里追溯不到原作者了:

server := myServer
client   := myClient
test     := soapTester
    
#your gsoap install directory
GSOAP_DIR=/root/Desktop/gsoap-2.8
    
#compiler
    
CORSS_COMPILER = 
    
G++ :=$(CORSS_COMPILER)g++

#flags
    
LIBS:=  -lpthread -lm
    
INCLS := -I ./ -I $(GSOAP_DIR)/gsoap
    
CFLAGS := -O2 -Wall -Wno-deprecated-declarations

    
COM_SOURCES := soapC.cpp  $(GSOAP_DIR)/gsoap/stdsoap2.cpp
    
COM_OBJS := $(COM_SOURCES:.cpp=.o)
OBJ_SOURCES := $(server).cpp soapServer.cpp $(client).cpp soapClient.cpp $(test).cpp
    
OBJS := $(OBJ_SOURCES:.cpp=.o) $(COM_OBJS)

#MAKE
    
.PHONY: all wsdl gsoap server client test
    
all: test
    
server: wsdl gsoap makeServer 
    
client: wsdl gsoap makeClient
    
test: wsdl gsoap makeTest
    
#files
    
WSDL_FILES := temp.h
    
GSOAP_FILES := soapClient.cpp soapServer.cpp soapC.cpp soapH.h soapStub.h
    
WSDL_SOURCE := $(wildcard *.wsdl)
    
ifeq ( , $(WSDL_SOURCE))
    
WSDL_SOURCE := $(GSOAP_DIR)/gsoap/WS/WS-Discovery.wsdl
    
endif
    
TYPEMAP = $(wildcard *typemap.dat)
    
ifeq ( , $(TYPEMAP))
    
TYPEMAP = $(GSOAP_DIR)/gsoap/typemap.dat
    
endif
    
wsdl:
    
ifneq ($(WSDL_FILES), $(wildcard $(WSDL_FILES)))
    
    $(GSOAP_DIR)/gsoap/wsdl2h -P -t $(TYPEMAP) $(WSDL_SOURCE) -o temp.h
    
endif
    
gsoap:
    
ifneq ($(GSOAP_FILES), $(wildcard $(GSOAP_FILES)))
    
    $(GSOAP_DIR)/gsoap/src/soapcpp2 -x -L -T -I $(GSOAP_DIR)/gsoap/import:$(GSOAP_DIR)/gsoap $(WSDL_FILES)
    
endif
    

    
makeServer:$(server).o soapServer.o $(COM_OBJS)
    
    $(G++) $(INCLS) $(CFLAGS) -o $(server) $^ $(LIBS)
    

makeClient:$(client).o soapClient.o $(COM_OBJS) 
    
    $(G++) $(INCLS) $(CFLAGS) -o $(client) $^ $(LIBS)

    
makeTest:$(test).o soapServer.o soapClient.o $(COM_OBJS)
    
    $(G++) $(INCLS) $(CFLAGS) -o $(test) $^ $(LIBS)
    

$(OBJS) :%.o:%.cpp
    
    $(G++) $(INCLS) $(CFLAGS) -o $@ -c $^ 
    
    
#clean
    
clean:
    
    @rm -rfv *.o *~ *Proxy.h *Object.h $(server) $(client) $(test)
    
deepClean:
    
    @rm -rfv *.o *~ *Proxy.h *Object.h $(server) $(client) $(test) *.nsmap $(GSOAP_FILES) $(WSDL_FILES) soapTester.cpp

這里需要將 GSOAP_DIR 后面的目錄修改為自己的解壓的gSoap2.8的目錄否过。然后make下就可以看到 soapTester生成成功了。代表這個(gè)環(huán)境已經(jīng)配置成功了苗桂。注意:以上代碼直接復(fù)制會(huì)讓Tab變成空格導(dǎo)致make的時(shí)候報(bào)規(guī)則錯(cuò)誤,請(qǐng)將空格替換為tab即可煤伟。

三癌佩、一個(gè)小嘗試(gsoap qq狀態(tài)查詢(xún)程序(并非實(shí)時(shí)準(zhǔn)確))

再次新建一個(gè)文件夾,這里我文件夾建立在了 gsoap-2.8/selfqqtest 中围辙。先將之前編譯生成的兩個(gè)工具(wsdl2h我碟、soapcpp2)拷貝到該目錄。

生成相關(guān)文件

wsdl2h -c -o qq.h [http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl](http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?wsdl)   //-c 是只生產(chǎn) C 語(yǔ)言的程序   

soapcpp2 -C qq.h  //這里只開(kāi)發(fā)Client端程序姚建,所以?xún)H加了一個(gè)-C

這時(shí)候所在目錄下會(huì)生成很多文件了矫俺。我這里例舉下我生產(chǎn)的文件:

qqOnlineWebServiceSoap.qqCheckOnline.req.xml
qqOnlineWebServiceSoap.qqCheckOnline.res.xml
qq.h
qqOnlineWebServiceSoap.nsmap
soapC.c
soapClientLib.c
soapClient.c
soapH.h
soapStub.h

這里我們?cè)偬幚硐驴蛻?hù)端程序:qqOnline.c

include "soapH.h"

include "qqOnlineWebServiceSoap.nsmap"

int main(int argc, char **argv)
{
if (argc != 2){
printf("Usage: %s qq_code\n", argv[0]);
exit(-1);
}
struct soap soap;
soap_init(&soap);
struct _ns1__qqCheckOnline request;
struct _ns1__qqCheckOnlineResponse response;
request.qqCode = argv[1];
if (soap_call___ns1__qqCheckOnline(&soap, NULL, NULL, &request, &response) == SOAP_OK){
char *state = NULL;
if (strcmp(response.qqCheckOnlineResult, "Y") == 0)
state = "在線(xiàn)";
if (strcmp(response.qqCheckOnlineResult, "N") == 0)
state = "不在線(xiàn)";
printf("你的QQ:%s 狀態(tài)是:%s\n", argv[1], state);
} else {
soap_print_fault(&soap, stderr);
}
soap_destroy(&soap);
soap_end(&soap);
soap_done(&soap);
return 0;
}

然后再使用gcc編譯下就可以了。

gcc -O2 -o qq qqOnline.c soapC.c soapClient.c ../gsoap/stdsoap2.c -I../gsoap/ -L../gsoap/

這里就會(huì)生產(chǎn)qq 文件了掸冤。這時(shí)候就可以進(jìn)行測(cè)試了厘托。

./qq 123456 

然后發(fā)現(xiàn)輸出說(shuō)竟然在線(xiàn)。后面發(fā)現(xiàn)只要位數(shù)對(duì)基本都是在線(xiàn)稿湿,因?yàn)椴皇菍?duì)接的騰訊的接口催烘,查詢(xún)出來(lái)的結(jié)果有問(wèn)題很正常。

四缎罢、參考文獻(xiàn)

  1. http://www.fx114.net/qa-227-66112.aspx 《gSOAP開(kāi)發(fā)實(shí)例(一)qq在線(xiàn)客戶(hù)端》
  2. http://blog.csdn.net/wind_breez/article/details/6097632 《使用gSOAP實(shí)現(xiàn)一個(gè)簡(jiǎn)單的QQ在線(xiàn)狀態(tài)查詢(xún)程序》 作者:wind_breez
  3. http://blog.chinaunix.net/uid-21768364-id-4648583.html 《linux下gsoap編程》作者:chenshko

真誠(chéng)感謝以上文獻(xiàn)的作者~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末伊群,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子策精,更是在濱河造成了極大的恐慌舰始,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咽袜,死亡現(xiàn)場(chǎng)離奇詭異丸卷,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)询刹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)谜嫉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人凹联,你說(shuō)我怎么就攤上這事沐兰。” “怎么了蔽挠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,057評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵住闯,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我澳淑,道長(zhǎng)比原,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,509評(píng)論 1 293
  • 正文 為了忘掉前任杠巡,我火速辦了婚禮量窘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘氢拥。我一直安慰自己蚌铜,他們只是感情好锨侯,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著厘线,像睡著了一般识腿。 火紅的嫁衣襯著肌膚如雪造壮。 梳的紋絲不亂的頭發(fā)上骂束,一...
    開(kāi)封第一講書(shū)人閱讀 51,443評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音旨枯,去河邊找鬼。 笑死攀隔,一個(gè)胖子當(dāng)著我的面吹牛栖榨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播满粗,決...
    沈念sama閱讀 40,251評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼愚争,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了捅彻?” 一聲冷哼從身側(cè)響起鞍陨,我...
    開(kāi)封第一講書(shū)人閱讀 39,129評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎贤旷,沒(méi)想到半個(gè)月后砾脑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,561評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盅藻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了勃蜘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片假残。...
    茶點(diǎn)故事閱讀 39,902評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖阳惹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莹汤,我是刑警寧澤颠印,帶...
    沈念sama閱讀 35,621評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站止潮,受9級(jí)特大地震影響闻坚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窿凤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評(píng)論 3 328
  • 文/蒙蒙 一雳殊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧夯秃,春花似錦、人聲如沸介陶。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,838評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)箕戳。三九已至国撵,卻和暖如春玻墅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背环础。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,971評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工赏酥, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留谆构,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,025評(píng)論 2 370
  • 正文 我出身青樓呵晨,卻偏偏與公主長(zhǎng)得像熬尺,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子粱哼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容