版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 前言</b></p><p> 移動(dòng)通信業(yè)務(wù)中,有一部分都是和手機(jī)繳費(fèi)的業(yè)務(wù)相關(guān),而手機(jī)繳費(fèi)業(yè)務(wù)目前處于發(fā)展的階段,手機(jī)繳費(fèi)業(yè)務(wù)作為目前唯一的數(shù)據(jù)業(yè)務(wù)正在飛速發(fā)展中</p><p> 近年來(lái),隨著中國(guó)市場(chǎng)經(jīng)濟(jì)的高速發(fā)展的情況下,社會(huì)上出現(xiàn)了很多新消費(fèi)模式,由此移動(dòng)通信行業(yè)衍生出很多新的業(yè)務(wù),具體情況可以總結(jié)為以下幾點(diǎn):</p&g
2、t;<p> 這追求效率的時(shí)代,隨著們生活水平的提高,消費(fèi)項(xiàng)目,服務(wù)種類(lèi)的增加,社會(huì)需要方便和快捷的繳費(fèi)方式。在當(dāng)今網(wǎng)絡(luò)社會(huì),技術(shù)成熟,發(fā)揮網(wǎng)絡(luò)技術(shù)優(yōu)勢(shì),利用網(wǎng)絡(luò)實(shí)現(xiàn)快捷繳費(fèi)已經(jīng)成為可能。 利用電子商務(wù)網(wǎng)絡(luò)以及眾多的營(yíng)業(yè)網(wǎng)點(diǎn)實(shí)時(shí)收費(fèi),在幾乎不增加系統(tǒng)負(fù)擔(dān)的情況既可緩解目前收費(fèi)單位營(yíng)業(yè)廳的緊張狀況,又方便用戶(hù)繳費(fèi),提高了費(fèi)用回收率。</p><p> 手機(jī)繳費(fèi)系統(tǒng)是基于UNIX Socket和My
3、SQL數(shù)據(jù)庫(kù)設(shè)計(jì)一個(gè)交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNU C或者GNU C++,在Linux make開(kāi)發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫(kù)和MySQL數(shù)據(jù)庫(kù)在網(wǎng)絡(luò)底層開(kāi)發(fā)交易型中間件,同時(shí)簡(jiǎn)要介紹了客戶(hù)端和服務(wù)器的工作模式。此模擬手機(jī)交費(fèi)系統(tǒng)采用“客戶(hù)端—中間件—服務(wù)器”模式,其中主要包括三大部分: 客戶(hù)端(Client),中間件(Middleware)和服務(wù)器端(Server)??蛻?hù)端(Client
4、)主要實(shí)現(xiàn)用戶(hù)管理、查詢(xún)、交易(交費(fèi),購(gòu)物等),撤銷(xiāo)和統(tǒng)計(jì)等功能;中間件(Middleware)要完成與客戶(hù)要求相符的功能——是本地的本地處理,否則發(fā)往服務(wù)器端——接受客戶(hù)端數(shù)據(jù),組織服務(wù)器端所需數(shù)據(jù),重組服務(wù)端返回?cái)?shù)據(jù),并返回給客戶(hù)方;服務(wù)器端(Server)主要實(shí)現(xiàn)客戶(hù)端或中間件提出的業(yè)務(wù)請(qǐng)求并做好留跡工作。</p><p> 本設(shè)計(jì)主要是利用UNIX系統(tǒng)提供的Socket庫(kù)在網(wǎng)絡(luò)底層,C語(yǔ)言,MySQL數(shù)
5、據(jù)庫(kù),以及軟件工程的思想方法和TCP/IP設(shè)計(jì)出的一個(gè)模擬手機(jī)交費(fèi)中間件系統(tǒng)。</p><p> 本設(shè)計(jì)包括了模擬手機(jī)交費(fèi)系統(tǒng)的開(kāi)發(fā)環(huán)境,設(shè)計(jì)目的,總體設(shè)計(jì),詳細(xì)設(shè)計(jì),具體實(shí)現(xiàn)代碼,以及設(shè)計(jì)中遇到的問(wèn)題及解決方法。將服務(wù)器端(Server),中間件(Middleware)和客戶(hù)端(Client)進(jìn)行連接后可模擬出現(xiàn)實(shí)中手機(jī)交費(fèi)的的功能。它可以實(shí)現(xiàn)手機(jī)費(fèi)用查詢(xún),話費(fèi)充值,打印花費(fèi)清單詳目等基本功能。</p&
6、gt;<p><b> 目錄</b></p><p> 一、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境)3</p><p><b> 二、計(jì)目的3</b></p><p> 三、體設(shè)計(jì)(程序設(shè)計(jì)組成框圖、流程圖、類(lèi)圖)4</p><p> ?。常背绦蛟O(shè)計(jì)組成框圖:4</p&g
7、t;<p> ?。常玻褐虚g件模型5</p><p><b> 3.3流程圖5</b></p><p><b> 四、詳細(xì)設(shè)計(jì)7</b></p><p><b> ?。矗痹O(shè)計(jì)方法7</b></p><p> ?。矗补δ苣K說(shuō)明7</p>
8、;<p><b> 五、調(diào)試與測(cè)試9</b></p><p><b> ?。担闭{(diào)試方法9</b></p><p> 5.2結(jié)果及簡(jiǎn)單分析10</p><p> 六、設(shè)計(jì)中遇到的問(wèn)題及解決方法10</p><p> 七、源程序清單11</p><p
9、> 八、總結(jié),收獲與體會(huì)36</p><p><b> 九、參考文獻(xiàn)37</b></p><p> 一、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境)</p><p> 硬件環(huán)境:intel p4 3.06GHz 80G硬盤(pán)</p><p> 軟件環(huán)境:基于windows xp虛擬機(jī)下的Red Linux操作系統(tǒng)&l
10、t;/p><p><b> 二、計(jì)目的</b></p><p> 本次設(shè)計(jì)的主要課題是:模擬手機(jī)繳費(fèi)系統(tǒng),通過(guò)對(duì)移動(dòng)通信話費(fèi)查詢(xún)與繳費(fèi)業(yè)務(wù)進(jìn)行了系統(tǒng)全面的分析研究。針對(duì)現(xiàn)有系統(tǒng)中實(shí)時(shí)性不足而造成用戶(hù)欠費(fèi)太多使公司企業(yè)蒙受損失的問(wèn)題。采用開(kāi)發(fā)工具Linux+My進(jìn)行系統(tǒng)設(shè)計(jì)?;赨inx Socket和MySQL數(shù)據(jù)庫(kù),設(shè)計(jì)一個(gè)交易型中間件系統(tǒng)。提供通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的
11、橋梁作用。例如電子商務(wù)、銀行代理業(yè)務(wù)軟件等都是這種類(lèi)型軟件。這里的中間件是指交易型中間件。交易型中間件是指用在不同行業(yè)、不同部門(mén)間的通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的軟件,在不同的行業(yè)、不同的系統(tǒng)間。這里主要是利用UNIX系統(tǒng)提供的Socket庫(kù)在網(wǎng)絡(luò)底層,開(kāi)發(fā)交易型中間件。</p><p> 本設(shè)計(jì)的目的是使參與設(shè)計(jì)者掌握利用軟件工程的思想方法和TCP/IP設(shè)計(jì)出用于不同行業(yè)和部門(mén)間的通訊轉(zhuǎn)發(fā)或協(xié)議轉(zhuǎn)換軟件—中間件,尤其掌
12、握這種設(shè)計(jì)的思想和方法。本設(shè)計(jì)系統(tǒng)能夠通過(guò)兩種方式提供對(duì)移動(dòng)話費(fèi)信息輸入、查詢(xún)、編輯以及話費(fèi)統(tǒng)計(jì)各明細(xì)項(xiàng)目的數(shù)據(jù)編輯,自動(dòng)計(jì)算出花費(fèi)的各項(xiàng)合計(jì)數(shù)據(jù);可自主設(shè)定條件從而達(dá)到對(duì)話費(fèi)數(shù)據(jù)的多角度查詢(xún)功能;方便導(dǎo)入、導(dǎo)出數(shù)據(jù)及輸出報(bào)表。</p><p> 三、體設(shè)計(jì)(程序設(shè)計(jì)組成框圖、流程圖、類(lèi)圖)</p><p> ?。常背绦蛟O(shè)計(jì)組成框圖:</p><p><b
13、> ?。常玻褐虚g件模型</b></p><p><b> ?。常沉鞒虉D</b></p><p><b> 四、詳細(xì)設(shè)計(jì)</b></p><p><b> 4.1設(shè)計(jì)方法</b></p><p> 在Linux環(huán)境下,使用GNU C或GNU C++,在
14、UNIX/Linux make開(kāi)發(fā)工具的的管理和控制下,利用UNIX/Linux Socket庫(kù)在網(wǎng)絡(luò)的底層進(jìn)行開(kāi)發(fā)設(shè)計(jì)。</p><p><b> ?。矗补δ苣K說(shuō)明</b></p><p> 本系統(tǒng)主要是由一個(gè)客戶(hù)機(jī),一個(gè)中間件以及兩個(gè)服務(wù)器組成,兩個(gè)服務(wù)器分別負(fù)責(zé)手機(jī)直接繳費(fèi)和網(wǎng)上銀行繳費(fèi)。以下即是每個(gè)模塊間的聯(lián)系圖:</p><p>
15、; 請(qǐng)求1 請(qǐng)求2</p><p> 返回 返回 </p><p><b> 請(qǐng)求服務(wù)</b></p><p><b> 響應(yīng)服務(wù)</b></p><p> 請(qǐng)求數(shù)據(jù) 返回結(jié)果 </p>
16、<p> ?。?)客戶(hù)機(jī):只負(fù)責(zé)發(fā)送和接收請(qǐng)求信息,此模塊的目的就是將信息呈現(xiàn)給用戶(hù)看,并提供相應(yīng)的操作選擇。此模塊處理信息的過(guò)程較簡(jiǎn)單,原理如基本功能的現(xiàn)金支付所述,在此不再多做介紹。</p><p> ?。?)中間件:與客戶(hù)機(jī)和服務(wù)器相連接,通過(guò)判斷倒數(shù)第二個(gè)字符來(lái)判斷選擇哪個(gè)服務(wù)器,具體的是把客戶(hù)端發(fā)來(lái)的信息轉(zhuǎn)發(fā)給哪個(gè)服務(wù)器。通過(guò)服務(wù)器反饋回來(lái)信息的特殊字符來(lái)判斷此信息是由哪個(gè)服務(wù)器發(fā)送而來(lái)。簡(jiǎn)單
17、來(lái)說(shuō),中間件在整個(gè)分布式系統(tǒng)中起數(shù)據(jù)總線的作用,將各種異構(gòu)系統(tǒng)通過(guò)中間件有機(jī)地結(jié)合成一個(gè)整體。</p><p> ?。?)服務(wù)器:本系統(tǒng)有兩個(gè)服務(wù)器,手機(jī)服務(wù)器(S2)和銀行服務(wù)器(S1)</p><p> 1)手機(jī)服務(wù)器在這一部分,需要實(shí)現(xiàn)的功能是直接繳費(fèi)。它的過(guò)程是接收從中間件過(guò)來(lái)的信息,在手機(jī)服務(wù)器的客戶(hù)賬戶(hù)上相應(yīng)加上對(duì)應(yīng)的話費(fèi),即更新手機(jī)服務(wù)器數(shù)據(jù)庫(kù)。更新成功直接之后,將繳費(fèi)成功
18、的信息傳回中間件。具體流程如下:</p><p> 現(xiàn)金繳納話費(fèi)工作流程圖</p><p> 注:直接現(xiàn)金繳納,不需要通過(guò)銀行服務(wù)器。從客戶(hù)端開(kāi)始流程,最后更新手機(jī)服務(wù)器數(shù)據(jù)庫(kù),即繳費(fèi)成功。</p><p> 2)銀行服務(wù)器在銀行服務(wù)器這一塊,需要實(shí)現(xiàn)的功能是手機(jī)網(wǎng)上繳費(fèi)。它的過(guò)程是接收從中間件過(guò)來(lái)的信息,在客戶(hù)所輸入的銀行賬戶(hù)上扣除相應(yīng)的手機(jī)費(fèi)用;如果在手機(jī)
19、的服務(wù)器那一塊出現(xiàn)問(wèn)題,繳費(fèi)不成功,銀行服務(wù)器還負(fù)責(zé)把之前所扣除的話費(fèi)給加上,具體實(shí)現(xiàn)流程如下:</p><p> 選擇銀行服務(wù)器后整個(gè)系統(tǒng)的工作流程圖:</p><p><b> 5</b></p><p><b> 4</b></p><p><b> 7</b>&
20、lt;/p><p><b> 16</b></p><p><b> 23</b></p><p> 虛線表示在手機(jī)服務(wù)器出錯(cuò),繳費(fèi)失敗,向銀行服務(wù)器返回所交的話費(fèi)。</p><p><b> 五、調(diào)試與測(cè)試</b></p><p><b&
21、gt; ?。担闭{(diào)試方法</b></p><p> (1)把數(shù)據(jù)庫(kù)文件導(dǎo)入數(shù)據(jù)庫(kù)</p><p> #mysql –u root <c1.sh</p><p> #mysql –u root <middl.sh</p><p> #mysql –u root <s1.sh</p><p
22、> #mysql –u root <s2.sh</p><p> (2)啟動(dòng)Mysql 數(shù)據(jù)(以bank為例) </p><p> #show database;</p><p> #use bank;</p><p> #show tables;</p><p> #select * from
23、 information;</p><p> ?。?)對(duì)程序進(jìn)行編譯連接</p><p> #gcc –o c1 c1.c –L/usr/lib/mysql -lmysqlclient</p><p> #gcc –o m1 m1.c –L/usr/lib/mysql -lmysqlclient</p><p>
24、 #gcc –o s1 s1.c –L/usr/lib/mysql -lmysqlclient</p><p> #gcc –o s2 s2.c –L/usr/lib/mysql -lmysqlclient</p><p><b> (5) 運(yùn)行程序</b></p><p><b> #./m1 x
25、</b></p><p><b> 切換到終端2</b></p><p> #./s1 world</p><p><b> 切換到終端3</b></p><p> #./s2 zhongjr</p><p><b> 切換到終端4<
26、/b></p><p> #./m1 x myhttp</p><p> ?。担步Y(jié)果及簡(jiǎn)單分析</p><p><b> 1:繳費(fèi)</b></p><p> 銀行繳費(fèi),銀行服務(wù)器與手機(jī)服務(wù)器都對(duì)信息有相應(yīng)的操作,繳費(fèi)得到確認(rèn)成功后,銀行卡上減去100元,手機(jī)話費(fèi)加上100元</p><
27、p><b> 2:查詢(xún)</b></p><p> 六、設(shè)計(jì)中遇到的問(wèn)題及解決方法</p><p> 我們遇到的第一個(gè)問(wèn)題就是:傳送的消息有許多亂碼,后來(lái)分析得出是字符串?dāng)?shù)組沒(méi)有清零,調(diào)用bzero(),清空后問(wèn)題解決。</p><p> 在取系統(tǒng)日期時(shí),我們的函數(shù)看著也沒(méi)什么問(wèn)題,但總提示有錯(cuò)誤,最后發(fā)現(xiàn)原來(lái)忘記了頭文件inclu
28、de<time.h>,加上后就正確了。</p><p> 還有一個(gè)最可惡的問(wèn)題,老是莫名奇妙的出現(xiàn)”段錯(cuò)誤”,開(kāi)始時(shí)摸不著頭腦,就和同學(xué)一塊商量,憑著各自了了的一點(diǎn)經(jīng)驗(yàn)討論,還好最后都解決了,主要時(shí)字符串末尾一定要加‘\0’,表示結(jié)束,否則可能是越界。</p><p><b> 主要問(wèn)題:</b></p><p> 對(duì)Mysq
29、l 數(shù)據(jù)庫(kù)不夠了解,對(duì)很多數(shù)據(jù)結(jié)構(gòu)和算法也理解不夠牢固,因此我們參考了《Linux+php+Mysql基礎(chǔ)與提高》這本書(shū),學(xué)到一些關(guān)于Mysql的基礎(chǔ)知識(shí),才使工作能順利的進(jìn)行下去。</p><p> 對(duì)套接字這樣的概念不是很清楚,在老師的輔導(dǎo)和互聯(lián)網(wǎng)的幫助下,了解了一些這方面的知識(shí),才使我們的設(shè)計(jì)開(kāi)展下來(lái)。</p><p> 以前對(duì)服務(wù)器,客戶(hù)端只是了解理論知識(shí),這次而要自己動(dòng)手來(lái)開(kāi)
30、發(fā)服務(wù)器,這對(duì)我們來(lái)說(shuō),是一個(gè)巨大的挑戰(zhàn),服務(wù)器就是一個(gè)進(jìn)程,確切的說(shuō)是一個(gè)守候進(jìn)程,要實(shí)現(xiàn)它的功能,是不容易的事情,你要學(xué)會(huì)套接字,地址轉(zhuǎn)換,服務(wù)器相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法才能進(jìn)行開(kāi)發(fā)和設(shè)計(jì)。</p><p> 還是很多基礎(chǔ)的東西沒(méi)有掌握好,基本的算法也沒(méi)有完全掌握,參考了教科書(shū)的相關(guān)內(nèi)容后,才開(kāi)始了我們的課程設(shè)計(jì)。</p><p> 在數(shù)據(jù)庫(kù)的編寫(xiě)時(shí),很多要用到的數(shù)據(jù)類(lèi)型而我們又沒(méi)有學(xué)
31、過(guò)的,只能借助互聯(lián)網(wǎng)的強(qiáng)大功能了,由此,我們也學(xué)到了很多相關(guān)的知識(shí)。</p><p><b> 七、源程序清單</b></p><p> 中間件代碼:#include <sys/socket.h></p><p> #include <sys/un.h></p><p> #include
32、 <netinet/in.h></p><p> #include <errno.h></p><p> #include <unistd.h></p><p> #include <signal.h></p><p> #include <sys/wait.h></p
33、><p> #include <netdb.h></p><p> #include <stdlib.h></p><p> #include <fcntl.h></p><p> #include <time.h></p><p> int main(int ar
34、gc,char *argv[])</p><p><b> {</b></p><p> int log(char *filepath,char *buff );</p><p> char log_file[10]="mid.log";</p><p> char log_buf[1024]
35、;</p><p><b> //網(wǎng)絡(luò)通信信息</b></p><p> int listen_fd;//監(jiān)聽(tīng)套接字描述符</p><p> int com_fd;//通信套接字描述符</p><p> int len;//請(qǐng)求方地址長(zhǎng)度</p><p><b> int re
36、t;</b></p><p> pid_t pid;//處理請(qǐng)求進(jìn)程id</p><p> struct servent *sp;//存放服務(wù)器端口信息,從services文件讀取</p><p> struct sockaddr_in srv_addr;//服務(wù)器地址</p><p> struct sockaddr_i
37、n clt_addr;//客戶(hù)端地址</p><p> listen_fd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建監(jiān)聽(tīng)套接字</p><p><b> //數(shù)據(jù)庫(kù)連接信息</b></p><p> MYSQL mysql;//MySQL連接</p><p> MYSQL_ROW ro
38、w;//結(jié)果的行</p><p> MYSQL_RES *result;//查詢(xún)結(jié)果</p><p> char myl_buf[1024];//存放sql語(yǔ)句</p><p> //初始化網(wǎng)絡(luò)連接參數(shù)</p><p> int DataSend(char *service,char *dest,char sed_buf[1024],
39、char rcv_buf[1024]);</p><p> if(listen_fd<0)</p><p><b> {</b></p><p> perror("創(chuàng)建監(jiān)聽(tīng)套接字失敗");</p><p> strcpy(log_buf,"創(chuàng)建監(jiān)聽(tīng)套接字失敗");&l
40、t;/p><p> log(log_file,log_buf);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //從services文件中獲取服務(wù)器端口號(hào)</p><p> if((sp=getservb
41、yname(argv[1],"tcp"))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"參數(shù)錯(cuò)誤");</p><p> strcpy(log_buf,"參數(shù)錯(cuò)誤");</p><p> log(
42、log_file,log_buf);</p><p><b> exit(-5);</b></p><p><b> }</b></p><p> memset(&srv_addr,0,sizeof(srv_addr));//將srv_addr初始化為全0</p><p><b&
43、gt; //設(shè)定地址參數(shù)</b></p><p> srv_addr.sin_family=AF_INET;</p><p> srv_addr.sin_addr.s_addr=htonl(INADDR_ANY);</p><p> srv_addr.sin_port=sp->s_port;</p><p><
44、b> //綁定服務(wù)套接字</b></p><p> ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));</p><p> if(ret==-1)</p><p><b> {</b></p><p> pe
45、rror("綁定服務(wù)套接字失敗");</p><p> strcpy(log_buf,"綁定服務(wù)套接字失敗");</p><p> log(log_file,log_buf);</p><p> close(listen_fd);</p><p><b> return 1;</
46、b></p><p><b> }</b></p><p><b> //監(jiān)聽(tīng)客戶(hù)連接</b></p><p> ret=listen(listen_fd,1024);</p><p> if(ret==-1)</p><p><b> {</
47、b></p><p> perror("監(jiān)聽(tīng)客戶(hù)請(qǐng)求失敗");</p><p> strcpy(log_buf,"監(jiān)聽(tīng)客戶(hù)請(qǐng)求失敗");</p><p> log(log_file,log_buf);</p><p> close(listen_fd);</p><p&
48、gt;<b> return 1;</b></p><p> }//連接users數(shù)據(jù)庫(kù)</p><p> if(mysql_init(&mysql)==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)連接初始失敗&
49、quot;);</p><p> strcpy(log_buf,"數(shù)據(jù)連接初始失敗");</p><p> log(log_file,log_buf);</p><p><b> exit(-1);</b></p><p><b> }</b></p>&l
50、t;p> if(!mysql_real_connect(&mysql,"localhost","root",0,"users",0,NULL,0))</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)庫(kù)連接錯(cuò)誤: %s [%d]\n&qu
51、ot;,mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_close(&mysql);</p><p><b> exit(-2);</b></p><p> } //開(kāi)始接受客戶(hù)請(qǐng)求</p><p> printf(&qu
52、ot;等待客戶(hù)連接\n");</p><p><b> while(1)</b></p><p><b> {</b></p><p> len=sizeof(clt_addr);</p><p> com_fd=accept(listen_fd,(struct sockaddr*
53、)&clt_addr,&len);</p><p> if(com_fd<0)</p><p><b> {</b></p><p> perror("接受客戶(hù)端連接請(qǐng)求失敗");</p><p> strcpy(log_buf,"接受客戶(hù)端連接請(qǐng)求失敗&quo
54、t;);</p><p> log(log_file,log_buf);</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p> if((pid=fork()
55、)==-1)</p><p><b> {</b></p><p> printf("開(kāi)創(chuàng)進(jìn)程失敗");</p><p> strcpy(log_buf,"開(kāi)創(chuàng)進(jìn)程失敗");</p><p> log(log_file,log_buf);</p><p&
56、gt;<b> return 1;</b></p><p><b> }</b></p><p> if(pid==0) //創(chuàng)建子進(jìn)程成功</p><p><b> {</b></p><p> close(listen_fd);//關(guān)閉監(jiān)聽(tīng)套接字</p&g
57、t;<p> //處理接受到的數(shù)據(jù)</p><p> char send_buf[1024];</p><p><b> int len;</b></p><p> if(len=read(com_fd,send_buf,1024)>0)</p><p><b> {</b&
58、gt;</p><p> if(send_buf[0]=='C')</p><p><b> {</b></p><p> printf("收到充值請(qǐng)求,信息如下\n");</p><p> printf("%s\n",send_buf);</p>
59、;<p> printf("手機(jī)號(hào)碼:%s\n",send_buf+2);</p><p> printf("銀行賬號(hào):%s\n",send_buf+17);</p><p> printf("銀行密碼:%s\n",send_buf+36);</p><p> printf("
60、;充值金額:%s\n",send_buf+46);</p><p> char p_send[1024];</p><p> char p_rcv[1024];</p><p> char b_send[1024];</p><p> char b_rcv[1024];</p><p><b&g
61、t; //繳費(fèi)封包</b></p><p> memcpy(p_send,"G",2);</p><p> memcpy(p_send+2,send_buf+2,15);</p><p> memcpy(p_send+17,send_buf+46,20); //扣款封包</p><p> memcpy
62、(b_send,"G",2);</p><p> memcpy(b_send+2,send_buf+17,19);</p><p> memcpy(b_send+21,send_buf+36,10);</p><p> memcpy(b_send+31,send_buf+46,20);</p><p> DataS
63、end(argv[2],argv[3],b_send,b_rcv);</p><p> printf("銀行數(shù)據(jù)已發(fā)送\n");</p><p> char t[1024];</p><p> memcpy(t,"D",2);</p><p> if(b_rcv[2]=='O')
64、</p><p><b> {</b></p><p> DataSend(argv[4],argv[5],p_send,p_rcv);</p><p> printf("移動(dòng)公司數(shù)據(jù)已發(fā)送\n");</p><p> if(p_rcv[2]=='O')</p>
65、<p><b> {</b></p><p> printf("充值成功\n");</p><p> memcpy(t+2,"O",2);</p><p> write(com_fd,t,1024);</p><p><b> }</b>&
66、lt;/p><p> else if(p_rcv[2]=='E')</p><p><b> {</b></p><p> memcpy(t+2,"E",2);</p><p> memcpy(t+4,p_rcv+4,50);</p><p> write
67、(com_fd,t,1024);</p><p><b> }</b></p><p> else if(b_rcv[2]=='E')</p><p><b> {</b></p><p> memcpy(t+2,"E",2);</p>&l
68、t;p> memcpy(t+4,b_rcv+4,50);</p><p><b> }</b></p><p><b> }</b></p><p> if(send_buf[0]=='A')</p><p><b> {</b></p&g
69、t;<p> printf("收到查詢(xún)請(qǐng)求:\n");</p><p> if(send_buf[2]=='B')</p><p><b> {</b></p><p> printf("收到銀行查詢(xún),信息如下\n");</p><p> p
70、rintf("%s\n",send_buf);</p><p> printf("%s\n",send_buf+2);</p><p> printf("銀行賬號(hào):%s\n",send_buf+4);</p><p> printf("銀行密碼:%s\n",send_buf+23)
71、;</p><p> char tmp[1024];</p><p> char tmp_r[1024];</p><p> memcpy(tmp,"E",2);</p><p> memcpy(tmp+2,send_buf+4,19);</p><p> memcpy(tmp+21,se
72、nd_buf+23,10);</p><p> printf("銀行賬號(hào):%s\n",tmp+2);</p><p> printf("銀行密碼:%s\n",tmp+21);</p><p> DataSend(argv[2],argv[3],tmp,tmp_r);</p><p> print
73、f("%s\n",tmp_r);</p><p> printf("%s\n",tmp_r+2);</p><p> printf("%s\n",tmp_r+4);</p><p> printf("%s\n",tmp_r+6);</p><p> pri
74、ntf("%s\n",tmp_r+36);</p><p> printf("%s\n",tmp_r+55);</p><p> write(com_fd,tmp_r,1024);</p><p><b> }</b></p><p> else if(send_buf[2
75、]=='P')</p><p><b> {</b></p><p> printf("收到手機(jī)查詢(xún),信息如下\n");</p><p> printf("%s\n",send_buf);</p><p> printf("%s\n",s
76、end_buf+2);</p><p> printf("手機(jī)號(hào)碼:%s\n",send_buf+4);</p><p> char tmp[1024];</p><p> char tmp_r[1024];</p><p> memcpy(tmp,"E",2);</p><
77、p> memcpy(tmp+2,send_buf+4,15);</p><p> printf("手機(jī)賬號(hào):%s\n",tmp+2);</p><p> DataSend(argv[4],argv[5],tmp,tmp_r);</p><p> printf("%s\n",tmp_r);</p>&
78、lt;p> printf("%s\n",tmp_r+2);</p><p> printf("%s\n",tmp_r+4);</p><p> printf("%s\n",tmp_r+6);</p><p> printf("%s\n",tmp_r+21);</p&g
79、t;<p> printf("%s\n",tmp_r+57);</p><p> write(com_fd,tmp_r,1024);</p><p><b> }</b></p><p><b> }</b></p><p><b> }<
80、/b></p><p><b> exit(0);</b></p><p><b> }</b></p><p><b> //回到父進(jìn)程</b></p><p><b> if(pid>0)</b></p><p&
81、gt;<b> {</b></p><p><b> wait(0);</b></p><p> close(com_fd);//關(guān)閉通信套接字</p><p><b> continue;</b></p><p><b> }</b></
82、p><p><b> }</b></p><p> int DataSend(char *service,char *dest,char sed_buf[1024],char rcv_buf[1024])//參數(shù)為服務(wù)端口端口號(hào)和主機(jī)名及需要發(fā)送的數(shù)據(jù)</p><p><b> {</b></p><
83、p> structhostent *hp;//服務(wù)地址</p><p> structsockaddr_in sin;//指明連接地址信息</p><p> structservent *sp;//服務(wù)端口</p><p> ints;//連接描述符</p><p><b> //獲取服務(wù)端口號(hào)</b
84、></p><p> if((sp=getservbyname(service,"tcp"))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"Error: getservbyname");</p><p><
85、b> exit(-5);</b></p><p><b> }</b></p><p><b> //獲取目的主機(jī)</b></p><p> if((hp=gethostbyname(dest))==0)</p><p><b> {</b><
86、/p><p> fprintf(stderr,"Error: gethostbyname");</p><p><b> exit(-6);</b></p><p><b> }</b></p><p> //初始化服務(wù)套接字</p><p> bz
87、ero(&sin,sizeof(sin));</p><p> bcopy(hp->h_addr,&sin.sin_addr,hp->h_length);</p><p> sin.sin_family=hp->h_addrtype;</p><p> sin.sin_port=sp->s_port;</p>
88、<p> if((s=socket(AF_INET,SOCK_STREAM,0))==-1)</p><p><b> {</b></p><p> fprintf(stderr,"Error: socket");</p><p><b> exit(-6);</b></p&
89、gt;<p><b> }</b></p><p> if(connect(s,&sin,sizeof(sin))==-1)</p><p><b> {</b></p><p> fprintf(stderr,"Error: connect");</p>&
90、lt;p><b> close(s);</b></p><p><b> exit(-6);</b></p><p><b> }</b></p><p><b> //發(fā)送數(shù)據(jù)</b></p><p> //fprintf(stderr,
91、"%s is sending request message: %s\n",argv[0],sed_buf);</p><p> if(write(s,sed_buf,1024)!=1024) //to server</p><p><b> {</b></p><p> fprintf(stderr,"W
92、rite Socket s ERROR\n!");</p><p><b> close(s);</b></p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(read(s,rcv_buf,1025
93、)==0) //get replay from server</p><p><b> {</b></p><p> fprintf(stderr,"Read Socket s Error\n");</p><p><b> close(s);</b></p><p>&
94、lt;b> exit(-2);</b></p><p><b> }</b></p><p> printf("%s\n",rcv_buf);</p><p> //printf("%s get reply: %s\n",argv[0],sed_buf);</p>
95、<p><b> close(s);</b></p><p><b> }</b></p><p><b> }</b></p><p> int log(char *filepath,char *buff )</p><p><b> {<
96、/b></p><p><b> int fd;</b></p><p> time_t t = time(0);</p><p> char tmp[64];</p><p> strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtim
97、e(&t) );</p><p> if((fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644))==-1)</p><p><b> {</b></p><p> fprintf(stderr,"Log file %s open error!\a\n",log);&
98、lt;/p><p><b> exit(-1);</b></p><p><b> }</b></p><p> write(fd,tmp,strlen(tmp));</p><p> write(fd,":",2);</p><p> write(
99、fd,buff,strlen(buff));</p><p> write(fd,"\n",2);</p><p> close(fd);</p><p><b> }</b></p><p><b> 銀行端:</b></p><p> int
100、 log(char *filepath,char *buff )</p><p><b> {</b></p><p><b> int fd;</b></p><p> time_t t = time(0);</p><p> char tmp[64];</p><p&
101、gt; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtime(&t) );</p><p> if((fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644))==-1)</p><p><b> {</b></p><
102、;p> fprintf(stderr,"Log file %s open error!\a\n",log);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> write(fd,tmp,strlen(tmp));</p>
103、;<p> write(fd,":",2);</p><p> write(fd,buff,strlen(buff));</p><p> write(fd,"\n",2);</p><p> close(fd);</p><p><b> }</b><
104、;/p><p> int main(int argc,char *argv[])</p><p><b> {</b></p><p> int log(char *filepath,char *buff );</p><p> char log_file[10]="bank.log";</
105、p><p> char log_buf[1024];</p><p> int fd;//日志文件描述符</p><p><b> //網(wǎng)絡(luò)通信信息</b></p><p> int listen_fd;//監(jiān)聽(tīng)套接字描述符</p><p> int com_fd;//通信套接字描述符<
106、;/p><p> int len;//請(qǐng)求方地址長(zhǎng)度</p><p><b> int ret;</b></p><p> pid_t pid;//處理請(qǐng)求進(jìn)程id</p><p> struct servent *sp;//存放服務(wù)器端口信息,從services文件讀取</p><p>
107、struct sockaddr_in srv_addr;//服務(wù)器地址</p><p> struct sockaddr_in clt_addr;//客戶(hù)端地址</p><p> listen_fd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建監(jiān)聽(tīng)套接字</p><p><b> //數(shù)據(jù)庫(kù)連接信息</b><
108、/p><p> MYSQL mysql;//MySQL連接</p><p> MYSQL_ROW row;//結(jié)果的行</p><p> MYSQL_RES *result;//查詢(xún)結(jié)果</p><p> char myl_buf[1024];//存放sql語(yǔ)句</p><p> //初始化網(wǎng)絡(luò)連接參數(shù)</
109、p><p> if(listen_fd<0)</p><p><b> {</b></p><p> perror("創(chuàng)建監(jiān)聽(tīng)套接字失敗");</p><p> strcat(log_buf,"創(chuàng)建監(jiān)聽(tīng)套接字失敗");</p><p> log(
110、log_file,log_buf);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //從services文件中獲取服務(wù)器端口號(hào)</p><p> if((sp=getservbyname(argv[1],"tcp&q
111、uot;))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"參數(shù)錯(cuò)誤");</p><p><b> exit(-5);</b></p><p><b> }</b></p>&l
112、t;p> memset(&srv_addr,0,sizeof(srv_addr));//將srv_addr初始化為全0</p><p><b> //設(shè)定地址參數(shù)</b></p><p> srv_addr.sin_family=AF_INET;</p><p> srv_addr.sin_addr.s_addr=hton
113、l(INADDR_ANY);</p><p> srv_addr.sin_port=sp->s_port;</p><p><b> //綁定服務(wù)套接字</b></p><p> ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));</p&g
114、t;<p> if(ret==-1)</p><p><b> {</b></p><p> perror("綁定服務(wù)套接字失敗");</p><p> strcat(log_buf,"綁定服務(wù)套接字失敗");</p><p> log(log_file,l
115、og_buf);</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> //監(jiān)聽(tīng)客戶(hù)連接</b></p><p> ret=l
116、isten(listen_fd,1024);</p><p> if(ret==-1)</p><p><b> {</b></p><p> perror("監(jiān)聽(tīng)客戶(hù)請(qǐng)求失敗");</p><p> strcat(log_buf,"監(jiān)聽(tīng)客戶(hù)請(qǐng)求失敗");</p>
117、;<p> log(log_file,log_buf);</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //連接users數(shù)據(jù)庫(kù)</p><
118、;p> if(mysql_init(&mysql)==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)連接初始失敗");</p><p> strcat(log_buf,"數(shù)據(jù)連接初始失敗");</p><p
119、> log(log_file,log_buf);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(!mysql_real_connect(&mysql,"localhost","root",0,
120、"bank",0,NULL,0))</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)庫(kù)連接錯(cuò)誤: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_clo
121、se(&mysql);</p><p><b> exit(-2);</b></p><p><b> }</b></p><p> //開(kāi)始接受客戶(hù)請(qǐng)求</p><p> printf("等待客戶(hù)連接\n");</p><p><b
122、> while(1)</b></p><p><b> {</b></p><p> len=sizeof(clt_addr);</p><p> com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);</p><p>
123、; if(com_fd<0)</p><p><b> {</b></p><p> perror("接受客戶(hù)端連接請(qǐng)求失敗");</p><p> strcat(log_buf,"接受客戶(hù)端連接請(qǐng)求失敗");</p><p> log(log_file,log_b
124、uf);</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p> if((pid=fork())==-1)</p><p><b> {</b
125、></p><p> printf("開(kāi)創(chuàng)進(jìn)程失敗");</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> //創(chuàng)建子進(jìn)程成功</b></p><p>
126、 if(pid==0)</p><p><b> {</b></p><p> close(listen_fd);//關(guān)閉監(jiān)聽(tīng)套接字</p><p> //處理接受到的數(shù)據(jù)</p><p> char send_buf[1024];</p><p><b> int len;
127、</b></p><p> if(len=read(com_fd,send_buf,1024)>0)</p><p><b> {</b></p><p> if(send_buf[0]=='G')</p><p><b> {</b></p>
128、<p> printf("收到充值請(qǐng)求,信息如下\n");</p><p> printf("%s\n",send_buf);</p><p> printf("銀行賬號(hào)%s\n",send_buf+2);</p><p> printf("銀行密碼%s\n",sen
129、d_buf+21);</p><p> printf("充值金額%s\n",send_buf+31);</p><p><b> //更新數(shù)據(jù)庫(kù)</b></p><p> sprintf(myl_buf,"select * from bank where number=\"%s\"&quo
130、t;,send_buf+2);</p><p> if(mysql_query(&mysql,myl_buf)!=0)</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)查詢(xún)錯(cuò)誤: %s [%d]\n",mysql_error(&mysql),mysql_err
131、no(&mysql));</p><p> mysql_close(&mysql);</p><p><b> exit(-3);</b></p><p><b> }</b></p><p> if((result=mysql_store_result(&mysql
132、))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"存放數(shù)據(jù)失敗: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_free_result(result);&l
133、t;/p><p> mysql_close(&mysql);</p><p><b> exit(-4);</b></p><p><b> };</b></p><p> if((mysql_num_rows(result))==0)</p><p><b
134、> {</b></p><p> printf("用戶(hù)不存在!\n");</p><p> strcat(log_buf,"用戶(hù)不存在!");</p><p> log(log_file,log_buf);</p><p><b> }</b></
135、p><p> row=mysql_fetch_row(result);</p><p> if(strcmp(row[1],send_buf+21)!=0)</p><p><b> {</b></p><p> printf("密碼錯(cuò)誤\n");</p><p><
136、b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> float money;</p><p> money=atof(row[3])-atof(send_buf+31);</p><p&
137、gt; printf("余額變更為:%f\n",money);</p><p> if(money>=0)</p><p><b> {</b></p><p> char buff[1024];</p><p> sprintf(myl_buf,"update bank s
138、et money=%f where number=\"%s\"",money,row[0]);</p><p> if(mysql_query(&mysql,myl_buf)!=0)</p><p><b> {</b></p><p> fprintf(stderr,"數(shù)據(jù)查詢(xún)錯(cuò)誤: %s
139、 [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_close(&mysql);</p><p><b> exit(-3);</b></p><p><b> }</b></p><
140、p><b> else</b></p><p><b> {</b></p><p> printf("更新成功!!");</p><p><b> }</b></p><p> memcpy(buff,"H",2);&l
141、t;/p><p> memcpy(buff+2,"O",2);</p><p> write(com_fd,buff,1024);</p><p><b> }</b></p><p><b> }</b></p><p><b> }&l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手機(jī)繳費(fèi)系統(tǒng)linux課程設(shè)計(jì)
- 課程設(shè)計(jì)--學(xué)生繳費(fèi)注冊(cè)管理系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)報(bào)告--linux操作系統(tǒng)應(yīng)用
- linux仿qq通信系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)論文
- 課程設(shè)計(jì)—手機(jī)銷(xiāo)售管理系統(tǒng)
- 手機(jī)銷(xiāo)售系統(tǒng)課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)報(bào)告
- linux課程設(shè)計(jì)76359
- linux課程設(shè)計(jì)76359
- 手機(jī)銷(xiāo)售管理系統(tǒng)課程設(shè)計(jì)報(bào)告
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
- 手機(jī)鍵盤(pán)課程設(shè)計(jì)
- 課程設(shè)計(jì)---操作系統(tǒng)課程設(shè)計(jì)之linux磁盤(pán)空間管理
- linux內(nèi)核裁剪課程設(shè)計(jì)
- 手機(jī)通信錄管理系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)---linux操作系統(tǒng)u盤(pán)驅(qū)動(dòng)設(shè)計(jì)分析報(bào)告
- linux課程設(shè)計(jì) 說(shuō)明書(shū)
評(píng)論
0/150
提交評(píng)論