基于linux的手機繳費系統(tǒng)_第1頁
基于linux的手機繳費系統(tǒng)_第2頁
基于linux的手機繳費系統(tǒng)_第3頁
基于linux的手機繳費系統(tǒng)_第4頁
基于linux的手機繳費系統(tǒng)_第5頁
已閱讀5頁,還剩33頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、 前言 移動通信業(yè)務(wù)中,有一部分都是和手機繳費的業(yè)務(wù)相關(guān),而手機繳費業(yè)務(wù)目前處于發(fā)展的階段,手機繳費業(yè)務(wù)作為目前唯一的數(shù)據(jù)業(yè)務(wù)正在飛速發(fā)展中近年來,隨著中國市場經(jīng)濟的高速發(fā)展的情況下,社會上出現(xiàn)了很多新消費模式,由此移動通信行業(yè)衍生出很多新的業(yè)務(wù),具體情況可以總結(jié)為以下幾點: 這追求效率的時代,隨著們生活水平的提高,消費項目,服務(wù)種類的增加,社會需要方便和快捷的繳費方式。在當今網(wǎng)絡(luò)社會,技術(shù)成熟,發(fā)揮網(wǎng)絡(luò)技術(shù)優(yōu)勢,利用網(wǎng)絡(luò)實現(xiàn)快捷繳費已經(jīng)成為可能。 利用電子商務(wù)網(wǎng)絡(luò)以及眾多的營業(yè)網(wǎng)點實時收費,在幾乎不增加系統(tǒng)負擔的情況既可緩解目前收費單位營業(yè)廳的緊張狀況,又方便用戶繳費,提高了費用回收率。 手

2、機繳費系統(tǒng)是基于UNIX Socket和MySQL數(shù)據(jù)庫設(shè)計一個交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNUC或者GNU C+,在Linux make開發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫和MySQL數(shù)據(jù)庫在網(wǎng)絡(luò)底層開發(fā)交易型中間件,同時簡要介紹了客戶端和服務(wù)器的工作模式。此模擬手機交費系統(tǒng)采用“客戶端中間件服務(wù)器”模式,其中主要包括三大部分: 客戶端(Client),中間件(Middleware)和服務(wù)器端(Server)??蛻舳?Client)主要實現(xiàn)用戶管理、查詢、交易(交費,購物等),撤銷和統(tǒng)計等功能;中間件(Middleware)要完成與客戶要求相符的功能是

3、本地的本地處理,否則發(fā)往服務(wù)器端接受客戶端數(shù)據(jù),組織服務(wù)器端所需數(shù)據(jù),重組服務(wù)端返回數(shù)據(jù),并返回給客戶方;服務(wù)器端(Server)主要實現(xiàn)客戶端或中間件提出的業(yè)務(wù)請求并做好留跡工作。 本設(shè)計主要是利用UNIX系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,C語言,MySQL數(shù)據(jù)庫,以及軟件工程的思想方法和TCP/IP設(shè)計出的一個模擬手機交費中間件系統(tǒng)。本設(shè)計包括了模擬手機交費系統(tǒng)的開發(fā)環(huán)境,設(shè)計目的,總體設(shè)計,詳細設(shè)計,具體實現(xiàn)代碼,以及設(shè)計中遇到的問題及解決方法。將服務(wù)器端(Server),中間件(Middleware)和客戶端(Client)進行連接后可模擬出現(xiàn)實中手機交費的的功能。它可以實現(xiàn)手機費用

4、查詢,話費充值,打印花費清單詳目等基本功能。 目錄一、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境)3二、計目的3三、體設(shè)計(程序設(shè)計組成框圖、流程圖、類圖)4程序設(shè)計組成框圖:4:中間件模型5流程圖5四、詳細設(shè)計7設(shè)計方法7功能模塊說明7五、調(diào)試與測試9調(diào)試方法9結(jié)果及簡單分析10六、設(shè)計中遇到的問題及解決方法10七、源程序清單11八、總結(jié),收獲與體會36九、參考文獻37一、系統(tǒng)環(huán)境(硬件環(huán)境、軟件環(huán)境)硬件環(huán)境:intel p4 3.06GHz 80G硬盤軟件環(huán)境:基于windows xp虛擬機下的Red Linux操作系統(tǒng)二、計目的本次設(shè)計的主要課題是:模擬手機繳費系統(tǒng),通過對移動通信話費查詢與繳費業(yè)務(wù)

5、進行了系統(tǒng)全面的分析研究。針對現(xiàn)有系統(tǒng)中實時性不足而造成用戶欠費太多使公司企業(yè)蒙受損失的問題。采用開發(fā)工具Linux+My進行系統(tǒng)設(shè)計?;赨inx Socket和My數(shù)據(jù)庫,設(shè)計一個交易型中間件系統(tǒng)。提供通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的橋梁作用。例如電子商務(wù)、銀行代理業(yè)務(wù)軟件等都是這種類型軟件。這里的中間件是指交易型中間件。交易型中間件是指用在不同行業(yè)、不同部門間的通訊轉(zhuǎn)發(fā)和協(xié)議轉(zhuǎn)換的軟件,在不同的行業(yè)、不同的系統(tǒng)間。這里主要是利用UNIX系統(tǒng)提供的Socket庫在網(wǎng)絡(luò)底層,開發(fā)交易型中間件。本設(shè)計的目的是使參與設(shè)計者掌握利用軟件工程的思想方法和TCP/IP設(shè)計出用于不同行業(yè)和部門間的通訊轉(zhuǎn)發(fā)或協(xié)議轉(zhuǎn)換

6、軟件中間件,尤其掌握這種設(shè)計的思想和方法。本設(shè)計系統(tǒng)能夠通過兩種方式提供對移動話費信息輸入、查詢、編輯以及話費統(tǒng)計各明細項目的數(shù)據(jù)編輯,自動計算出花費的各項合計數(shù)據(jù);可自主設(shè)定條件從而達到對話費數(shù)據(jù)的多角度查詢功能;方便導入、導出數(shù)據(jù)及輸出報表。三、體設(shè)計(程序設(shè)計組成框圖、流程圖、類圖)程序設(shè)計組成框圖: 實現(xiàn)工具及方法基本功能Linux +Mysql+ VMware Workstation客戶端<->中間件1.手機余額查詢客戶端發(fā)送:頭部(A)+ 目標(移動公司P)+手機號碼(15) +機主姓名(30) 中間件發(fā)送:頭部(B)+ 目標(移動公司P)+標志(O)+ 手機號碼(15

7、)+ 機主(30) +余額(20)或:頭部(B)目標(移動公司P)+標志(E)+出錯原因2.銀行賬戶余額查詢:客戶端發(fā)送:頭部(A)+目標(銀行B)+銀行賬戶(19)+密碼(10)中間件發(fā)送:頭部(B)+目標(銀行B)+標志(O)+戶主(30)+賬號(19)+余額(20)或:頭部(B)+目標(銀行B)+標志(E)+錯誤信息3.手機充值客戶端發(fā)送:頭部(C)+手機號碼(15)+銀行賬戶(19)+銀行密碼(10)+充值金額(20)中間件發(fā)送:頭部(D)+標志(O)或:頭部(D)+標志(E)+錯誤原因中間件<->服務(wù)器中間件<->銀行服務(wù)器1.查詢余額中間件發(fā)送:頭部(E)+

8、銀行賬戶(19)+密碼(10)服務(wù)器發(fā)送:頭部(F)+標志(O)+銀行賬號(19)+用戶名(30)+余額(20)或:頭部(F)+標志(E)+出錯原因2.扣款中間件發(fā)送:頭部(G)+銀行賬戶(19)+密碼(10)+扣款金額(20)服務(wù)器發(fā)送:頭部(H)+標志(O)或:頭部(H)+標志(E)+出錯原因中間件<->移動服務(wù)器1.查詢余額中間件發(fā)送:頭部(E)+手機號碼(15)服務(wù)器發(fā)送:頭部(F)+標志(O)+手機號碼(15)+機主姓名(30)+余額(20)或:頭部(F)+標志(E)+出錯原因2.繳費中間件發(fā)送:頭部(G)+手機號碼(15)+繳費金額(20)服務(wù)器發(fā)送:頭部(H)+標志(

9、O)或:頭部(H)+標志(O)+出錯原因退出系統(tǒng)當完成一次交易時,就可以退出系統(tǒng)。:中間件模型流程圖Socker()建立服務(wù)方套接字,描述符為sbingd()綁定套接字與本地地址和端口Linsten()通知TCP,準備接受Socker()建立服務(wù)方套接字,描述符為saccept()等待客戶方連接Connect()建立與服務(wù)方鏈接recv()/read()讀取客戶方數(shù)據(jù)Send()/write()向服務(wù)器方發(fā)送請求成功后返回與s具相同特性的新套接字服務(wù)處理及數(shù)據(jù)加等待服務(wù)器方send()/write向客戶方提供服務(wù)結(jié)果recv()/read讀取服務(wù)方數(shù)據(jù)Close()關(guān)閉新套接字s,結(jié)束本次對話

10、Close()關(guān)閉最初套接字s,結(jié)束服務(wù)器Close()關(guān)閉最初套接字s,結(jié)束本次對話四、詳細設(shè)計設(shè)計方法在Linux環(huán)境下,使用GNU C或GNU C+,在UNIX/Linux make開發(fā)工具的的管理和控制下,利用UNIX/Linux Socket庫在網(wǎng)絡(luò)的底層進行開發(fā)設(shè)計。功能模塊說明本系統(tǒng)主要是由一個客戶機,一個中間件以及兩個服務(wù)器組成,兩個服務(wù)器分別負責手機直接繳費和網(wǎng)上銀行繳費。以下即是每個模塊間的聯(lián)系圖:LogClient 2Client 1 請求1 請求2 返回 返回 Log中 間 件(Middleware)請求服務(wù) 響應(yīng)服務(wù)Log Middleware服務(wù)器端(Server)

11、請求數(shù)據(jù) 返回結(jié)果 Log MiddlewareMysql database(1)客戶機:只負責發(fā)送和接收請求信息,此模塊的目的就是將信息呈現(xiàn)給用戶看,并提供相應(yīng)的操作選擇。此模塊處理信息的過程較簡單,原理如基本功能的現(xiàn)金支付所述,在此不再多做介紹。(2)中間件:與客戶機和服務(wù)器相連接,通過判斷倒數(shù)第二個字符來判斷選擇哪個服務(wù)器,具體的是把客戶端發(fā)來的信息轉(zhuǎn)發(fā)給哪個服務(wù)器。通過服務(wù)器反饋回來信息的特殊字符來判斷此信息是由哪個服務(wù)器發(fā)送而來。簡單來說,中間件在整個分布式系統(tǒng)中起數(shù)據(jù)總線的作用,將各種異構(gòu)系統(tǒng)通過中間件有機地結(jié)合成一個整體。(3)服務(wù)器:本系統(tǒng)有兩個服務(wù)器,手機服務(wù)器(S2)和銀行

12、服務(wù)器(S1)1)手機服務(wù)器在這一部分,需要實現(xiàn)的功能是直接繳費。它的過程是接收從中間件過來的信息,在手機服務(wù)器的客戶賬戶上相應(yīng)加上對應(yīng)的話費,即更新手機服務(wù)器數(shù)據(jù)庫。更新成功直接之后,將繳費成功的信息傳回中間件。具體流程如下:查詢用戶信息繳費金額中間件處理 更新銀行數(shù)據(jù)庫現(xiàn)金繳納話費工作流程圖Service2(手機服務(wù)器)middleclient 注:直接現(xiàn)金繳納,不需要通過銀行服務(wù)器。從客戶端開始流程,最后更新手機服務(wù)器數(shù)據(jù)庫,即繳費成功。2)銀行服務(wù)器在銀行服務(wù)器這一塊,需要實現(xiàn)的功能是手機網(wǎng)上繳費。它的過程是接收從中間件過來的信息,在客戶所輸入的銀行賬戶上扣除相應(yīng)的手機費用;如果在手機

13、的服務(wù)器那一塊出現(xiàn)問題,繳費不成功,銀行服務(wù)器還負責把之前所扣除的話費給加上,具體實現(xiàn)流程如下:更新銀行數(shù)據(jù)庫手機繳費失敗返回扣除費用手機繳費成功從銀行卡扣錢switch(v00)查詢用戶信息選擇銀行服務(wù)器后整個系統(tǒng)的工作流程圖:Service2(手機服務(wù)器)clientmiddleService2(銀行服務(wù)器) 54716 23虛線表示在手機服務(wù)器出錯,繳費失敗,向銀行服務(wù)器返回所交的話費。五、調(diào)試與測試調(diào)試方法(1)把數(shù)據(jù)庫文件導入數(shù)據(jù)庫#mysql u root <c1.sh#mysql u root <middl.sh#mysql u root <s1.sh#mysq

14、l u root <s2.sh(2)啟動Mysql 數(shù)據(jù)(以bank為例) #show database;#use bank;#show tables;#select * from information;(3)對程序進行編譯連接#gcc o c1 c1.c L/usr/lib/mysql -lmysqlclient#gcc o m1 m1.c L/usr/lib/mysql -lmysqlclient#gcc o s1 s1.c L/usr/lib/mysql -lmysqlclient#gcc o s2 s2.c L/usr/lib/mysql -lmysqlclient (5) 運

15、行程序#./m1 x切換到終端2#./s1 world切換到終端3#./s2 zhongjr切換到終端4#./m1 x myhttp結(jié)果及簡單分析1:繳費銀行繳費,銀行服務(wù)器與手機服務(wù)器都對信息有相應(yīng)的操作,繳費得到確認成功后,銀行卡上減去100元,手機話費加上100元2:查詢六、設(shè)計中遇到的問題及解決方法我們遇到的第一個問題就是:傳送的消息有許多亂碼,后來分析得出是字符串數(shù)組沒有清零,調(diào)用bzero(),清空后問題解決。在取系統(tǒng)日期時,我們的函數(shù)看著也沒什么問題,但總提示有錯誤,最后發(fā)現(xiàn)原來忘記了頭文件include<time.h>,加上后就正確了。還有一個最可惡的問題,老是莫名

16、奇妙的出現(xiàn)”段錯誤”,開始時摸不著頭腦,就和同學一塊商量,憑著各自了了的一點經(jīng)驗討論,還好最后都解決了,主要時字符串末尾一定要加0,表示結(jié)束,否則可能是越界。主要問題:(1) 對Mysql 數(shù)據(jù)庫不夠了解,對很多數(shù)據(jù)結(jié)構(gòu)和算法也理解不夠牢固,因此我們參考了Linux+php+Mysql基礎(chǔ)與提高這本書,學到一些關(guān)于Mysql的基礎(chǔ)知識,才使工作能順利的進行下去。(2) 對套接字這樣的概念不是很清楚,在老師的輔導和互聯(lián)網(wǎng)的幫助下,了解了一些這方面的知識,才使我們的設(shè)計開展下來。(3) 以前對服務(wù)器,客戶端只是了解理論知識,這次而要自己動手來開發(fā)服務(wù)器,這對我們來說,是一個巨大的挑戰(zhàn),服務(wù)器就是一

17、個進程,確切的說是一個守候進程,要實現(xiàn)它的功能,是不容易的事情,你要學會套接字,地址轉(zhuǎn)換,服務(wù)器相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法才能進行開發(fā)和設(shè)計。(4) 還是很多基礎(chǔ)的東西沒有掌握好,基本的算法也沒有完全掌握,參考了教科書的相關(guān)內(nèi)容后,才開始了我們的課程設(shè)計。(5) 在數(shù)據(jù)庫的編寫時,很多要用到的數(shù)據(jù)類型而我們又沒有學過的,只能借助互聯(lián)網(wǎng)的強大功能了,由此,我們也學到了很多相關(guān)的知識。七、源程序清單中間件代碼:#include <sys/socket.h>#include <sys/un.h>#include <netinet/in.h>#include <er

18、rno.h>#include <unistd.h>#include <signal.h>#include <sys/wait.h>#include <netdb.h>#include <stdlib.h>#include <fcntl.h>#include <time.h>int main(int argc,char *argv) int log(char *filepath,char *buff ); char log_file10="mid.log" char log_buf102

19、4; /網(wǎng)絡(luò)通信信息 int listen_fd;/監(jiān)聽套接字描述符 int com_fd;/通信套接字描述符 int len;/請求方地址長度 int ret; pid_t pid;/處理請求進程id struct servent *sp;/存放服務(wù)器端口信息,從services文件讀取 struct sockaddr_in srv_addr;/服務(wù)器地址 struct sockaddr_in clt_addr;/客戶端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);/創(chuàng)建監(jiān)聽套接字 /數(shù)據(jù)庫連接信息 MYSQL mysql;/MySQL連接 MYSQL

20、_ROW row;/結(jié)果的行 MYSQL_RES *result;/查詢結(jié)果 char myl_buf1024;/存放sql語句 /初始化網(wǎng)絡(luò)連接參數(shù) int DataSend(char *service,char *dest,char sed_buf1024,char rcv_buf1024); if(listen_fd<0) perror("創(chuàng)建監(jiān)聽套接字失敗"); strcpy(log_buf,"創(chuàng)建監(jiān)聽套接字失敗"); log(log_file,log_buf); return 1; /從services文件中獲取服務(wù)器端口號 if(sp=

21、getservbyname(argv1,"tcp")=NULL) fprintf(stderr,"參數(shù)錯誤"); strcpy(log_buf,"參數(shù)錯誤"); log(log_file,log_buf); exit(-5); memset(&srv_addr,0,sizeof(srv_addr);/將srv_addr初始化為全0 /設(shè)定地址參數(shù) srv_addr.sin_family=AF_INET; srv_addr.sin_addr.s_addr=htonl(INADDR_ANY); srv_addr.sin_port=

22、sp->s_port; /綁定服務(wù)套接字 ret=bind(listen_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr); if(ret=-1) perror("綁定服務(wù)套接字失敗"); strcpy(log_buf,"綁定服務(wù)套接字失敗"); log(log_file,log_buf); close(listen_fd); return 1; /監(jiān)聽客戶連接 ret=listen(listen_fd,1024); if(ret=-1) perror("監(jiān)聽客戶請求失敗")

23、; strcpy(log_buf,"監(jiān)聽客戶請求失敗"); log(log_file,log_buf); close(listen_fd); return 1; /連接users數(shù)據(jù)庫 if(mysql_init(&mysql)=NULL) fprintf(stderr,"數(shù)據(jù)連接初始失敗"); strcpy(log_buf,"數(shù)據(jù)連接初始失敗"); log(log_file,log_buf); exit(-1); if(!mysql_real_connect(&mysql,"localhost",

24、"root",0,"users",0,NULL,0) fprintf(stderr,"數(shù)據(jù)庫連接錯誤: %s %dn",mysql_error(&mysql),mysql_errno(&mysql); mysql_close(&mysql); exit(-2); /開始接受客戶請求 printf("等待客戶連接n"); while(1) len=sizeof(clt_addr); com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,

25、&len); if(com_fd<0) perror("接受客戶端連接請求失敗"); strcpy(log_buf,"接受客戶端連接請求失敗"); log(log_file,log_buf); close(listen_fd); return 1; if(pid=fork()=-1) printf("開創(chuàng)進程失敗"); strcpy(log_buf,"開創(chuàng)進程失敗"); log(log_file,log_buf); return 1; if(pid=0) /創(chuàng)建子進程成功 close(listen_f

26、d);/關(guān)閉監(jiān)聽套接字 /處理接受到的數(shù)據(jù) char send_buf1024; int len; if(len=read(com_fd,send_buf,1024)>0) if(send_buf0='C') printf("收到充值請求,信息如下n"); printf("%sn",send_buf); printf("手機號碼:%sn",send_buf+2); printf("銀行賬號:%sn",send_buf+17); printf("銀行密碼:%sn",send_

27、buf+36); printf("充值金額:%sn",send_buf+46); char p_send1024; char p_rcv1024; char b_send1024; char b_rcv1024; /繳費封包 memcpy(p_send,"G",2); memcpy(p_send+2,send_buf+2,15); memcpy(p_send+17,send_buf+46,20); /扣款封包 memcpy(b_send,"G",2); memcpy(b_send+2,send_buf+17,19); memcpy(b

28、_send+21,send_buf+36,10); memcpy(b_send+31,send_buf+46,20); DataSend(argv2,argv3,b_send,b_rcv); printf("銀行數(shù)據(jù)已發(fā)送n"); char t1024; memcpy(t,"D",2); if(b_rcv2='O') DataSend(argv4,argv5,p_send,p_rcv); printf("移動公司數(shù)據(jù)已發(fā)送n"); if(p_rcv2='O') printf("充值成功n&qu

29、ot;); memcpy(t+2,"O",2); write(com_fd,t,1024); else if(p_rcv2='E') memcpy(t+2,"E",2); memcpy(t+4,p_rcv+4,50); write(com_fd,t,1024); else if(b_rcv2='E') memcpy(t+2,"E",2); memcpy(t+4,b_rcv+4,50); if(send_buf0='A') printf("收到查詢請求:n"); if(

30、send_buf2='B') printf("收到銀行查詢,信息如下n"); printf("%sn",send_buf); printf("%sn",send_buf+2); printf("銀行賬號:%sn",send_buf+4); printf("銀行密碼:%sn",send_buf+23); char tmp1024; char tmp_r1024; memcpy(tmp,"E",2); memcpy(tmp+2,send_buf+4,19); me

31、mcpy(tmp+21,send_buf+23,10); printf("銀行賬號:%sn",tmp+2); printf("銀行密碼:%sn",tmp+21); DataSend(argv2,argv3,tmp,tmp_r); printf("%sn",tmp_r); printf("%sn",tmp_r+2); printf("%sn",tmp_r+4); printf("%sn",tmp_r+6); printf("%sn",tmp_r+36); p

32、rintf("%sn",tmp_r+55); write(com_fd,tmp_r,1024); else if(send_buf2='P') printf("收到手機查詢,信息如下n"); printf("%sn",send_buf); printf("%sn",send_buf+2); printf("手機號碼:%sn",send_buf+4); char tmp1024; char tmp_r1024; memcpy(tmp,"E",2); memcpy

33、(tmp+2,send_buf+4,15); printf("手機賬號:%sn",tmp+2); DataSend(argv4,argv5,tmp,tmp_r); printf("%sn",tmp_r); printf("%sn",tmp_r+2); printf("%sn",tmp_r+4); printf("%sn",tmp_r+6); printf("%sn",tmp_r+21); printf("%sn",tmp_r+57); write(com_

34、fd,tmp_r,1024); exit(0); /回到父進程 if(pid>0) wait(0); close(com_fd);/關(guān)閉通信套接字 continue; int DataSend(char *service,char *dest,char sed_buf1024,char rcv_buf1024)/參數(shù)為服務(wù)端口端口號和主機名及需要發(fā)送的數(shù)據(jù) structhostent *hp;/服務(wù)地址 structsockaddr_in sin;/指明連接地址信息 structservent *sp;/服務(wù)端口 ints;/連接描述符 /獲取服務(wù)端口號 if(sp=getservbyn

35、ame(service,"tcp")=NULL) fprintf(stderr,"Error: getservbyname"); exit(-5); /獲取目的主機 if(hp=gethostbyname(dest)=0) fprintf(stderr,"Error: gethostbyname"); exit(-6); /初始化服務(wù)套接字 bzero(&sin,sizeof(sin); bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); sin.sin_family

36、=hp->h_addrtype; sin.sin_port=sp->s_port; if(s=socket(AF_INET,SOCK_STREAM,0)=-1) fprintf(stderr,"Error: socket"); exit(-6); if(connect(s,&sin,sizeof(sin)=-1) fprintf(stderr,"Error: connect"); close(s); exit(-6); /發(fā)送數(shù)據(jù) /fprintf(stderr,"%s is sending request message:

37、 %sn",argv0,sed_buf); if(write(s,sed_buf,1024)!=1024) /to server fprintf(stderr,"Write Socket s ERRORn!"); close(s); exit(-1); if(read(s,rcv_buf,1025)=0) /get replay from server fprintf(stderr,"Read Socket s Errorn"); close(s); exit(-2); printf("%sn",rcv_buf); /pri

38、ntf("%s get reply: %sn",argv0,sed_buf); close(s); int log(char *filepath,char *buff ) int fd; time_t t = time(0); char tmp64; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtime(&t) ); if(fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644)=-1) fprintf(stderr,"Log file %

39、s open error!an",log); exit(-1); write(fd,tmp,strlen(tmp); write(fd,":",2); write(fd,buff,strlen(buff); write(fd,"n",2); close(fd);銀行端:int log(char *filepath,char *buff ) int fd; time_t t = time(0); char tmp64; strftime( tmp, sizeof(tmp), "%Y/%m/%d %X %A ",localtim

40、e(&t) ); if(fd=open(filepath,O_WRONLY|O_CREAT|O_APPEND,0644)=-1) fprintf(stderr,"Log file %s open error!an",log); exit(-1); write(fd,tmp,strlen(tmp); write(fd,":",2); write(fd,buff,strlen(buff); write(fd,"n",2); close(fd);int main(int argc,char *argv) int log(char *

41、filepath,char *buff ); char log_file10="bank.log" char log_buf1024; int fd;/日志文件描述符 /網(wǎng)絡(luò)通信信息 int listen_fd;/監(jiān)聽套接字描述符 int com_fd;/通信套接字描述符 int len;/請求方地址長度 int ret; pid_t pid;/處理請求進程id struct servent *sp;/存放服務(wù)器端口信息,從services文件讀取 struct sockaddr_in srv_addr;/服務(wù)器地址 struct sockaddr_in clt_addr;

42、/客戶端地址 listen_fd=socket(PF_INET,SOCK_STREAM,0);/創(chuàng)建監(jiān)聽套接字 /數(shù)據(jù)庫連接信息 MYSQL mysql;/MySQL連接 MYSQL_ROW row;/結(jié)果的行 MYSQL_RES *result;/查詢結(jié)果 char myl_buf1024;/存放sql語句 /初始化網(wǎng)絡(luò)連接參數(shù) if(listen_fd<0) perror("創(chuàng)建監(jiān)聽套接字失敗"); strcat(log_buf,"創(chuàng)建監(jiān)聽套接字失敗"); log(log_file,log_buf); return 1; /從services文

43、件中獲取服務(wù)器端口號 if(sp=getservbyname(argv1,"tcp")=NULL) fprintf(stderr,"參數(shù)錯誤"); exit(-5); memset(&srv_addr,0,sizeof(srv_addr);/將srv_addr初始化為全0 /設(shè)定地址參數(shù) srv_addr.sin_family=AF_INET; srv_addr.sin_addr.s_addr=htonl(INADDR_ANY); srv_addr.sin_port=sp->s_port; /綁定服務(wù)套接字 ret=bind(listen_

44、fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr); if(ret=-1) perror("綁定服務(wù)套接字失敗"); strcat(log_buf,"綁定服務(wù)套接字失敗"); log(log_file,log_buf); close(listen_fd); return 1; /監(jiān)聽客戶連接 ret=listen(listen_fd,1024); if(ret=-1) perror("監(jiān)聽客戶請求失敗"); strcat(log_buf,"監(jiān)聽客戶請求失敗"); log(log_file,log_buf); close(listen_fd); return 1; /連接users數(shù)據(jù)庫 if(mysql_init(&mysql)=NULL) fprintf(stderr,"數(shù)據(jù)連接初始失敗"); strcat(log_buf,"數(shù)據(jù)連接初始失敗"); log(log_file,log_buf); exi

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論