版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 前言</b></p><p> 移動通信業(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> 近年來,隨著中國市場經(jīng)濟(jì)的高速發(fā)展的情況下,社會上出現(xiàn)了很多新消費(fèi)模式,由此移動通信行業(yè)衍生出很多新的業(yè)務(wù),具體情況可以總結(jié)為以下幾點(diǎn):</p&g
2、t;<p> 這追求效率的時代,隨著們生活水平的提高,消費(fèi)項(xiàng)目,服務(wù)種類的增加,社會需要方便和快捷的繳費(fèi)方式。在當(dāng)今網(wǎng)絡(luò)社會,技術(shù)成熟,發(fā)揮網(wǎng)絡(luò)技術(shù)優(yōu)勢,利用網(wǎng)絡(luò)實(shí)現(xiàn)快捷繳費(fèi)已經(jīng)成為可能。 利用電子商務(wù)網(wǎng)絡(luò)以及眾多的營業(yè)網(wǎng)點(diǎn)實(shí)時收費(fèi),在幾乎不增加系統(tǒng)負(fù)擔(dān)的情況既可緩解目前收費(fèi)單位營業(yè)廳的緊張狀況,又方便用戶繳費(fèi),提高了費(fèi)用回收率。</p><p> 手機(jī)繳費(fèi)系統(tǒng)是基于UNIX Socket和My
3、SQL數(shù)據(jù)庫設(shè)計(jì)一個交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNU C或者GNU C++,在Linux make開發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫和MySQL數(shù)據(jù)庫在網(wǎng)絡(luò)底層開發(fā)交易型中間件,同時簡要介紹了客戶端和服務(wù)器的工作模式。此模擬手機(jī)交費(fèi)系統(tǒng)采用“客戶端—中間件—服務(wù)器”模式,其中主要包括三大部分: 客戶端(Client),中間件(Middleware)和服務(wù)器端(Server)??蛻舳?Client
4、)主要實(shí)現(xiàn)用戶管理、查詢、交易(交費(fèi),購物等),撤銷和統(tǒng)計(jì)等功能;中間件(Middleware)要完成與客戶要求相符的功能——是本地的本地處理,否則發(fā)往服務(wù)器端——接受客戶端數(shù)據(jù),組織服務(wù)器端所需數(shù)據(jù),重組服務(wù)端返回數(shù)據(jù),并返回給客戶方;服務(wù)器端(Server)主要實(shí)現(xiàn)客戶端或中間件提出的業(yè)務(wù)請求并做好留跡工作。</p><p> 本設(shè)計(jì)主要是利用UNIX系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,C語言,MySQL數(shù)
5、據(jù)庫,以及軟件工程的思想方法和TCP/IP設(shè)計(jì)出的一個模擬手機(jī)交費(fèi)中間件系統(tǒng)。</p><p> 本設(shè)計(jì)包括了模擬手機(jī)交費(fèi)系統(tǒng)的開發(fā)環(huán)境,設(shè)計(jì)目的,總體設(shè)計(jì),詳細(xì)設(shè)計(jì),具體實(shí)現(xiàn)代碼,以及設(shè)計(jì)中遇到的問題及解決方法。將服務(wù)器端(Server),中間件(Middleware)和客戶端(Client)進(jìn)行連接后可模擬出現(xiàn)實(shí)中手機(jī)交費(fèi)的的功能。它可以實(shí)現(xiàn)手機(jī)費(fèi)用查詢,話費(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ì)組成框圖、流程圖、類圖)4</p><p> ?。常背绦蛟O(shè)計(jì)組成框圖:4</p&g
7、t;<p> ?。常玻褐虚g件模型5</p><p><b> ?。常沉鞒虉D5</b></p><p><b> 四、詳細(xì)設(shè)計(jì)7</b></p><p><b> ?。矗痹O(shè)計(jì)方法7</b></p><p> 4.2功能模塊說明7</p>
8、;<p><b> 五、調(diào)試與測試9</b></p><p><b> ?。担闭{(diào)試方法9</b></p><p> ?。担步Y(jié)果及簡單分析10</p><p> 六、設(shè)計(jì)中遇到的問題及解決方法10</p><p> 七、源程序清單11</p><p
9、> 八、總結(jié),收獲與體會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><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),通過對移動通信話費(fèi)查詢與繳費(fèi)業(yè)務(wù)進(jìn)行了系統(tǒng)全面的分析研究。針對現(xiàn)有系統(tǒng)中實(shí)時性不足而造成用戶欠費(fèi)太多使公司企業(yè)蒙受損失的問題。采用開發(fā)工具Linux+My進(jìn)行系統(tǒng)設(shè)計(jì)?;赨inx Socket和MySQL數(shù)據(jù)庫,設(shè)計(jì)一個交易型中間件系統(tǒng)。提供通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的
11、橋梁作用。例如電子商務(wù)、銀行代理業(yè)務(wù)軟件等都是這種類型軟件。這里的中間件是指交易型中間件。交易型中間件是指用在不同行業(yè)、不同部門間的通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的軟件,在不同的行業(yè)、不同的系統(tǒng)間。這里主要是利用UNIX系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,開發(fā)交易型中間件。</p><p> 本設(shè)計(jì)的目的是使參與設(shè)計(jì)者掌握利用軟件工程的思想方法和TCP/IP設(shè)計(jì)出用于不同行業(yè)和部門間的通訊轉(zhuǎn)發(fā)或協(xié)議轉(zhuǎn)換軟件—中間件,尤其掌
12、握這種設(shè)計(jì)的思想和方法。本設(shè)計(jì)系統(tǒng)能夠通過兩種方式提供對移動話費(fèi)信息輸入、查詢、編輯以及話費(fèi)統(tǒng)計(jì)各明細(xì)項(xiàng)目的數(shù)據(jù)編輯,自動計(jì)算出花費(fèi)的各項(xiàng)合計(jì)數(shù)據(jù);可自主設(shè)定條件從而達(dá)到對話費(fèi)數(shù)據(jù)的多角度查詢功能;方便導(dǎo)入、導(dǎo)出數(shù)據(jù)及輸出報表。</p><p> 三、體設(shè)計(jì)(程序設(shè)計(jì)組成框圖、流程圖、類圖)</p><p> 3.1程序設(shè)計(jì)組成框圖:</p><p><b
13、> ?。常玻褐虚g件模型</b></p><p><b> ?。常沉鞒虉D</b></p><p><b> 四、詳細(xì)設(shè)計(jì)</b></p><p><b> ?。矗痹O(shè)計(jì)方法</b></p><p> 在Linux環(huán)境下,使用GNU C或GNU C++,在
14、UNIX/Linux make開發(fā)工具的的管理和控制下,利用UNIX/Linux Socket庫在網(wǎng)絡(luò)的底層進(jìn)行開發(fā)設(shè)計(jì)。</p><p><b> ?。矗补δ苣K說明</b></p><p> 本系統(tǒng)主要是由一個客戶機(jī),一個中間件以及兩個服務(wù)器組成,兩個服務(wù)器分別負(fù)責(zé)手機(jī)直接繳費(fèi)和網(wǎng)上銀行繳費(fèi)。以下即是每個模塊間的聯(lián)系圖:</p><p>
15、; 請求1 請求2</p><p> 返回 返回 </p><p><b> 請求服務(wù)</b></p><p><b> 響應(yīng)服務(wù)</b></p><p> 請求數(shù)據(jù) 返回結(jié)果 </p>
16、<p> (1)客戶機(jī):只負(fù)責(zé)發(fā)送和接收請求信息,此模塊的目的就是將信息呈現(xiàn)給用戶看,并提供相應(yīng)的操作選擇。此模塊處理信息的過程較簡單,原理如基本功能的現(xiàn)金支付所述,在此不再多做介紹。</p><p> ?。?)中間件:與客戶機(jī)和服務(wù)器相連接,通過判斷倒數(shù)第二個字符來判斷選擇哪個服務(wù)器,具體的是把客戶端發(fā)來的信息轉(zhuǎn)發(fā)給哪個服務(wù)器。通過服務(wù)器反饋回來信息的特殊字符來判斷此信息是由哪個服務(wù)器發(fā)送而來。簡單
17、來說,中間件在整個分布式系統(tǒng)中起數(shù)據(jù)總線的作用,將各種異構(gòu)系統(tǒng)通過中間件有機(jī)地結(jié)合成一個整體。</p><p> ?。?)服務(wù)器:本系統(tǒng)有兩個服務(wù)器,手機(jī)服務(wù)器(S2)和銀行服務(wù)器(S1)</p><p> 1)手機(jī)服務(wù)器在這一部分,需要實(shí)現(xiàn)的功能是直接繳費(fèi)。它的過程是接收從中間件過來的信息,在手機(jī)服務(wù)器的客戶賬戶上相應(yīng)加上對應(yīng)的話費(fèi),即更新手機(jī)服務(wù)器數(shù)據(jù)庫。更新成功直接之后,將繳費(fèi)成功
18、的信息傳回中間件。具體流程如下:</p><p> 現(xiàn)金繳納話費(fèi)工作流程圖</p><p> 注:直接現(xiàn)金繳納,不需要通過銀行服務(wù)器。從客戶端開始流程,最后更新手機(jī)服務(wù)器數(shù)據(jù)庫,即繳費(fèi)成功。</p><p> 2)銀行服務(wù)器在銀行服務(wù)器這一塊,需要實(shí)現(xiàn)的功能是手機(jī)網(wǎng)上繳費(fèi)。它的過程是接收從中間件過來的信息,在客戶所輸入的銀行賬戶上扣除相應(yīng)的手機(jī)費(fèi)用;如果在手機(jī)
19、的服務(wù)器那一塊出現(xiàn)問題,繳費(fèi)不成功,銀行服務(wù)器還負(fù)責(zé)把之前所扣除的話費(fèi)給加上,具體實(shí)現(xiàn)流程如下:</p><p> 選擇銀行服務(wù)器后整個系統(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ù)器出錯,繳費(fèi)失敗,向銀行服務(wù)器返回所交的話費(fèi)。</p><p><b> 五、調(diào)試與測試</b></p><p><b&
21、gt; 5.1調(diào)試方法</b></p><p> (1)把數(shù)據(jù)庫文件導(dǎo)入數(shù)據(jù)庫</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)啟動Mysql 數(shù)據(jù)(以bank為例) </p><p> #show database;</p><p> #use bank;</p><p> #show tables;</p><p> #select * from
23、 information;</p><p> ?。?)對程序進(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é)果及簡單分析</p><p><b> 1:繳費(fèi)</b></p><p> 銀行繳費(fèi),銀行服務(wù)器與手機(jī)服務(wù)器都對信息有相應(yīng)的操作,繳費(fèi)得到確認(rèn)成功后,銀行卡上減去100元,手機(jī)話費(fèi)加上100元</p><
27、p><b> 2:查詢</b></p><p> 六、設(shè)計(jì)中遇到的問題及解決方法</p><p> 我們遇到的第一個問題就是:傳送的消息有許多亂碼,后來分析得出是字符串?dāng)?shù)組沒有清零,調(diào)用bzero(),清空后問題解決。</p><p> 在取系統(tǒng)日期時,我們的函數(shù)看著也沒什么問題,但總提示有錯誤,最后發(fā)現(xiàn)原來忘記了頭文件inclu
28、de<time.h>,加上后就正確了。</p><p> 還有一個最可惡的問題,老是莫名奇妙的出現(xiàn)”段錯誤”,開始時摸不著頭腦,就和同學(xué)一塊商量,憑著各自了了的一點(diǎn)經(jīng)驗(yàn)討論,還好最后都解決了,主要時字符串末尾一定要加‘\0’,表示結(jié)束,否則可能是越界。</p><p><b> 主要問題:</b></p><p> 對Mysq
29、l 數(shù)據(jù)庫不夠了解,對很多數(shù)據(jù)結(jié)構(gòu)和算法也理解不夠牢固,因此我們參考了《Linux+php+Mysql基礎(chǔ)與提高》這本書,學(xué)到一些關(guān)于Mysql的基礎(chǔ)知識,才使工作能順利的進(jìn)行下去。</p><p> 對套接字這樣的概念不是很清楚,在老師的輔導(dǎo)和互聯(lián)網(wǎng)的幫助下,了解了一些這方面的知識,才使我們的設(shè)計(jì)開展下來。</p><p> 以前對服務(wù)器,客戶端只是了解理論知識,這次而要自己動手來開
30、發(fā)服務(wù)器,這對我們來說,是一個巨大的挑戰(zhàn),服務(wù)器就是一個進(jìn)程,確切的說是一個守候進(jìn)程,要實(shí)現(xiàn)它的功能,是不容易的事情,你要學(xué)會套接字,地址轉(zhuǎn)換,服務(wù)器相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法才能進(jìn)行開發(fā)和設(shè)計(jì)。</p><p> 還是很多基礎(chǔ)的東西沒有掌握好,基本的算法也沒有完全掌握,參考了教科書的相關(guān)內(nèi)容后,才開始了我們的課程設(shè)計(jì)。</p><p> 在數(shù)據(jù)庫的編寫時,很多要用到的數(shù)據(jù)類型而我們又沒有學(xué)
31、過的,只能借助互聯(lián)網(wǎng)的強(qiáng)大功能了,由此,我們也學(xué)到了很多相關(guān)的知識。</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)聽套接字描述符</p><p> int com_fd;//通信套接字描述符</p><p> int len;//請求方地址長度</p><p><b> int re
36、t;</b></p><p> pid_t pid;//處理請求進(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;//客戶端地址</p><p> listen_fd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建監(jiān)聽套接字</p><p><b> //數(shù)據(jù)庫連接信息</b></p><p> MYSQL mysql;//MySQL連接</p><p> MYSQL_ROW ro
38、w;//結(jié)果的行</p><p> MYSQL_RES *result;//查詢結(jié)果</p><p> char myl_buf[1024];//存放sql語句</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)聽套接字失敗");</p><p> strcpy(log_buf,"創(chuàng)建監(jiān)聽套接字失敗");&l
40、t;/p><p> log(log_file,log_buf);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //從services文件中獲取服務(wù)器端口號</p><p> if((sp=getservb
41、yname(argv[1],"tcp"))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"參數(shù)錯誤");</p><p> strcpy(log_buf,"參數(shù)錯誤");</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)聽客戶連接</b></p><p> ret=listen(listen_fd,1024);</p><p> if(ret==-1)</p><p><b> {</
47、b></p><p> perror("監(jiān)聽客戶請求失敗");</p><p> strcpy(log_buf,"監(jiān)聽客戶請求失敗");</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ù)庫</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ù)庫連接錯誤: %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> } //開始接受客戶請求</p><p> printf(&qu
52、ot;等待客戶連接\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("接受客戶端連接請求失敗");</p><p> strcpy(log_buf,"接受客戶端連接請求失敗&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("開創(chuàng)進(jìn)程失敗");</p><p> strcpy(log_buf,"開創(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)聽套接字</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("收到充值請求,信息如下\n");</p><p> printf("%s\n",send_buf);</p>
59、;<p> printf("手機(jī)號碼:%s\n",send_buf+2);</p><p> printf("銀行賬號:%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("移動公司數(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("收到查詢請求:\n");</p><p> if(send_buf[2]=='B')</p><p><b> {</b></p><p> printf("收到銀行查詢,信息如下\n");</p><p> p
70、rintf("%s\n",send_buf);</p><p> printf("%s\n",send_buf+2);</p><p> printf("銀行賬號:%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("銀行賬號:%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ī)查詢,信息如下\n");</p><p> printf("%s\n",send_buf);</p><p> printf("%s\n",s
76、end_buf+2);</p><p> printf("手機(jī)號碼:%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ī)賬號:%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ù)端口端口號和主機(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ù)端口號</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)聽套接字描述符</p><p> int com_fd;//通信套接字描述符<
106、;/p><p> int len;//請求方地址長度</p><p><b> int ret;</b></p><p> pid_t pid;//處理請求進(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;//客戶端地址</p><p> listen_fd=socket(PF_INET,SOCK_STREAM,0);//創(chuàng)建監(jiān)聽套接字</p><p><b> //數(shù)據(jù)庫連接信息</b><
108、/p><p> MYSQL mysql;//MySQL連接</p><p> MYSQL_ROW row;//結(jié)果的行</p><p> MYSQL_RES *result;//查詢結(jié)果</p><p> char myl_buf[1024];//存放sql語句</p><p> //初始化網(wǎng)絡(luò)連接參數(shù)</
109、p><p> if(listen_fd<0)</p><p><b> {</b></p><p> perror("創(chuàng)建監(jiān)聽套接字失敗");</p><p> strcat(log_buf,"創(chuàng)建監(jiān)聽套接字失敗");</p><p> log(
110、log_file,log_buf);</p><p><b> return 1;</b></p><p><b> }</b></p><p> //從services文件中獲取服務(wù)器端口號</p><p> if((sp=getservbyname(argv[1],"tcp&q
111、uot;))==NULL)</p><p><b> {</b></p><p> fprintf(stderr,"參數(shù)錯誤");</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)聽客戶連接</b></p><p> ret=l
116、isten(listen_fd,1024);</p><p> if(ret==-1)</p><p><b> {</b></p><p> perror("監(jiān)聽客戶請求失敗");</p><p> strcat(log_buf,"監(jiān)聽客戶請求失敗");</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ù)庫</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ù)庫連接錯誤: %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> //開始接受客戶請求</p><p> printf("等待客戶連接\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("接受客戶端連接請求失敗");</p><p> strcat(log_buf,"接受客戶端連接請求失敗");</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("開創(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)聽套接字</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("收到充值請求,信息如下\n");</p><p> printf("%s\n",send_buf);</p><p> printf("銀行賬號%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ù)庫</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ù)查詢錯誤: %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("用戶不存在!\n");</p><p> strcat(log_buf,"用戶不存在!");</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("密碼錯誤\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ù)查詢錯誤: %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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 手機(jī)繳費(fèi)系統(tǒng)linux課程設(shè)計(jì)
- 課程設(shè)計(jì)--學(xué)生繳費(fèi)注冊管理系統(tǒng)
- linux操作系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)報告--linux操作系統(tǒng)應(yīng)用
- linux仿qq通信系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)論文
- 課程設(shè)計(jì)—手機(jī)銷售管理系統(tǒng)
- 手機(jī)銷售系統(tǒng)課程設(shè)計(jì)論文
- linux課程設(shè)計(jì)報告
- linux課程設(shè)計(jì)76359
- linux課程設(shè)計(jì)76359
- 手機(jī)銷售管理系統(tǒng)課程設(shè)計(jì)報告
- linux操作系統(tǒng)基礎(chǔ)課程設(shè)計(jì)
- 手機(jī)鍵盤課程設(shè)計(jì)
- 課程設(shè)計(jì)---操作系統(tǒng)課程設(shè)計(jì)之linux磁盤空間管理
- linux內(nèi)核裁剪課程設(shè)計(jì)
- 手機(jī)通信錄管理系統(tǒng)課程設(shè)計(jì)
- linux課程設(shè)計(jì)---linux操作系統(tǒng)u盤驅(qū)動設(shè)計(jì)分析報告
- linux課程設(shè)計(jì) 說明書
評論
0/150
提交評論