版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p> 《軟件實習(xí)2》任務(wù)書</p><p> 設(shè)計題目 電費(fèi)代繳系統(tǒng) </p><p> 學(xué)生班級 </p><p> 學(xué)生學(xué)號 </p><p> 學(xué)生姓名 </p>
2、<p> 同 組 人 </p><p> 指導(dǎo)老師 </p><p><b> 目錄</b></p><p> 《軟件實習(xí)2》任務(wù)書- 0 -</p><p> 一: 前言- 2 -</
3、p><p> 二: 系統(tǒng)環(huán)境- 2 -</p><p> 三: 設(shè)計目的- 2 -</p><p> 四: 總體設(shè)計- 3 -</p><p> 1.客戶端頁面- 3 -</p><p> 2.客戶端,中間件和服務(wù)器聯(lián)系- 3 -</p><p> 五: 詳細(xì)設(shè)計- 4 -&
4、lt;/p><p> ?。?)基本功能- 4 -</p><p> 1.1查詢費(fèi)用- 4 -</p><p> ?。?) 服務(wù)器的開發(fā)- 4 -</p><p> 2.1服務(wù)端的開發(fā)- 4 -</p><p> 2.2 客戶端的開發(fā)- 5 -</p><p> 2.3套接字- 5
5、 -</p><p> 六: 調(diào)試與測試- 6 -</p><p> 一.生成數(shù)據(jù)庫(source *.sh)- 6 -</p><p> 二.程序的編譯和運(yùn)行- 6 -</p><p> 三.多任務(wù)模式與啟動相關(guān)服務(wù)- 6 -</p><p> 四.相關(guān)操作- 7 -</p><
6、;p> 五.返回結(jié)果信息- 8 -</p><p> 七: 設(shè)計中遇到的問題及解決方法:- 9 -</p><p> 八: 源程序清單- 9 -</p><p> 8.1數(shù)據(jù)庫文件- 9 -</p><p> 8.2客戶端程序- 10 -</p><p> 8.3中間件程序- 16 -&l
7、t;/p><p> 8.4服務(wù)器- 22 -</p><p> 8.5服務(wù)器- 27 -</p><p> 九: 心得體會- 32 -</p><p> 十:參考文獻(xiàn)- 33 -</p><p><b> 電費(fèi)代繳系統(tǒng)</b></p><p><b>
8、; 一: 前言</b></p><p> 近年來,隨著高科技技術(shù)的告訴發(fā)展,傳統(tǒng)的手工操作系統(tǒng)為主的電費(fèi)繳納的管理方式,因其信息反應(yīng)慢,工作效率低,管理質(zhì)量差,備受廣大服務(wù)者爭議。在計算機(jī)信息技術(shù)飛速發(fā)展與廣泛應(yīng)用的今天,這種落后的管理方式與時代的步伐已顯得格格不入,對電費(fèi)繳納系統(tǒng)實現(xiàn)智能化,信息管理化,是信息時代對現(xiàn)代社會電費(fèi)管理工作提出的嚴(yán)峻要求。為了更好的提供電費(fèi)代繳服務(wù),為了使電費(fèi)管理更加
9、科學(xué),更嚴(yán)謹(jǐn),同時更具有操作性,節(jié)省操作人員的勞動,電費(fèi)繳納系統(tǒng)必須與先進(jìn)技術(shù)相結(jié)合,應(yīng)用先進(jìn)的網(wǎng)絡(luò)管理技術(shù)來操作電費(fèi)管理系統(tǒng),從而使其為人們提供更方便,更快捷的電費(fèi)管理服務(wù)。</p><p><b> 二: 系統(tǒng)環(huán)境</b></p><p> 在Linux環(huán)境下,使用GNU C或GNU C++,在UNIX/Linux make開發(fā)工具的的管理和控制下,利用UNI
10、X/Linux Socket庫在網(wǎng)絡(luò)的底層進(jìn)行開發(fā)設(shè)計。</p><p> 電費(fèi)繳費(fèi)系統(tǒng)是基于UNIX Socket和MySQL數(shù)據(jù)庫設(shè)計一個交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNU C或者GNU C++,在Linux make開發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫和MySQL數(shù)據(jù)庫在網(wǎng)絡(luò)底層開發(fā)交易型中間件,同時簡要介紹了客戶端和服務(wù)器的工作模式。此模擬電費(fèi)交費(fèi)系統(tǒng)采用“客戶端—
11、中間件—服務(wù)器”模式,其中主要包括三大部分: 客戶端(Client),中間件(Middleware)和服務(wù)器端(Server)。客戶端(Client)主要實現(xiàn)用戶管理、查詢、交易(交費(fèi),購物等),撤銷和統(tǒng)計等功能;中間件(Middleware)要完成與客戶要求相符的功能——是本地的本地處理,否則發(fā)往服務(wù)器端——接受客戶端數(shù)據(jù),組織服務(wù)器端所需數(shù)據(jù),重組服務(wù)端返回數(shù)據(jù),并返回給客戶方;服務(wù)器端(Server)主要實現(xiàn)客戶端或中間件提出的業(yè)
12、務(wù)請求并做好留跡工作</p><p><b> 三: 設(shè)計目的</b></p><p> 對電費(fèi)查詢與繳費(fèi)業(yè)務(wù)進(jìn)行了系統(tǒng)全面的分析研究。針對現(xiàn)有系統(tǒng)中實時性不足而造成用戶欠費(fèi)太多使公司企業(yè)蒙受損失的問題。采用開發(fā)工具Linux+Mysql進(jìn)行系統(tǒng)設(shè)計。設(shè)計系統(tǒng)能夠提供對點(diǎn)費(fèi)信息輸入、查詢、編輯、打印以及話費(fèi)統(tǒng)計各明細(xì)項目的數(shù)據(jù)編輯,自動計算出電費(fèi)的各項合計數(shù)據(jù);可
13、自主設(shè)定條件從而達(dá)到數(shù)據(jù)的多角度查詢功能;方便導(dǎo)入、導(dǎo)出數(shù)據(jù)及輸出報表。</p><p><b> 四: 總體設(shè)計</b></p><p><b> 1.客戶端頁面</b></p><p> 2.客戶端,中間件和服務(wù)器聯(lián)系</p><p><b> 五: 詳細(xì)設(shè)計</b>
14、;</p><p><b> ?。?)基本功能</b></p><p><b> 1.1查詢費(fèi)用 </b></p><p> 客戶到柜臺繳納費(fèi)用,客戶首先用賬號及密碼登陸系統(tǒng),然后登陸電表序列號和銀行賬號,中間件根據(jù)用戶提供的電表序列號碼把“查詢費(fèi)用”指令存入數(shù)據(jù)庫。中間件檢測到查詢費(fèi)用指令,把查詢費(fèi)用指令組成數(shù)據(jù)包發(fā)
15、送到服務(wù)器中。服務(wù)器把查詢費(fèi)用的結(jié)果返回中間件,確認(rèn)信息后,從接收表中檢測返回結(jié)果中間件,并監(jiān)控因錯誤操作并返回結(jié)果。 服務(wù)器從接收表中查詢到“查詢費(fèi)用”指令,把查詢費(fèi)用指令填入數(shù)據(jù)庫.得到查詢費(fèi)用指令后從主數(shù)據(jù)庫查詢用戶的費(fèi)用信息。服務(wù)器如果因錯誤沒有得到查詢結(jié)果,把返回結(jié)果系統(tǒng)錯誤,并顯示出來。 1.2繳納費(fèi)用 </p><p> 客戶端發(fā)出“繳納費(fèi)用”指令存入中間件。中間件檢測到“繳納費(fèi)用”指令,把“繳
16、納費(fèi)用”指令組成數(shù)據(jù)包放入緩沖區(qū),然后發(fā)送給服務(wù)器。 服務(wù)器把“繳納費(fèi)用”的指令填入接收,并返回確認(rèn)信息。中間件在得到確認(rèn)信息后,從接收表中檢測返回結(jié)果給客戶端,并監(jiān)控錯誤無返回結(jié)果的情況。 服務(wù)器從接收表中查詢到“繳納費(fèi)用”指令,把“繳納費(fèi)用”指令填入數(shù)據(jù)庫。得到“繳納費(fèi)用” 后從主數(shù)據(jù)庫進(jìn)行處理,并把銀行數(shù)據(jù)庫中所繳的費(fèi)用扣除,結(jié)果填入數(shù)據(jù)庫。 “服務(wù)器處理系統(tǒng)”如果因為錯誤沒有得到結(jié)果,把返回結(jié)果“系統(tǒng)錯誤”填入發(fā)送錯誤信息給中間
17、件,然后中間件把信息返回給用戶。 1.3 查詢信息</p><p> 通過用戶名和電表序列號進(jìn)行查詢,錄入正確則返回用戶信息,反之,退出系統(tǒng)。1.4 退出系統(tǒng)</p><p> 客戶端發(fā)送退出系統(tǒng)請求,經(jīng)中間件確認(rèn)。然后客戶端退出系統(tǒng)并關(guān)閉連接。</p><p> (2) 服務(wù)器的開發(fā)</p><p><b> 2.
18、1服務(wù)端的開發(fā)</b></p><p> 服務(wù)器主要包含守候進(jìn)程(daemon),也叫精靈進(jìn)程,或服務(wù)器進(jìn)程,是生存期長的一種進(jìn)程。它們常常在系統(tǒng)引導(dǎo)裝入時起動,在系統(tǒng)關(guān)閉時終止。因為它們沒有控制終端,所以說它們是在后臺運(yùn)行的。它等待客戶機(jī)與其聯(lián)系,提出某種類型的服務(wù)要求。服務(wù)對客戶機(jī)服務(wù)可將結(jié)果或信息返回給客戶機(jī)(雙向),也可不返回(單向)。</p><p> 2.2 客
19、戶端的開發(fā)</p><p> 打開一通信通道,并連接到服務(wù)器所在主機(jī)的特定端口。向服務(wù)器發(fā)服務(wù)請求,等待并接收應(yīng)答;請求結(jié)束后關(guān)閉通信通道。</p><p> 客戶是交易的發(fā)起者。實現(xiàn)功能與服務(wù)器方同。</p><p><b> 2.3套接字 </b></p><p> 1.流式套接字(SOCK-STREAM):
20、</p><p> 提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務(wù),數(shù)據(jù)無差錯、無重復(fù)地發(fā)送,且按發(fā)送順序接收。內(nèi)設(shè)流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議(FTP)即使用流式套接字。</p><p> 數(shù)據(jù)報式套接字(SOCK-DGRAM) :提供了一個無連接服務(wù)。數(shù)據(jù)包以獨(dú)立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復(fù),并且接收順序混亂。</p>
21、;<p> 原始式套接字(SOCK-RAW):該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有服務(wù)中配置的新設(shè)備。</p><p> 基本套接字系統(tǒng)調(diào)用 </p><p> 創(chuàng)建套接字—socket() </p><p> 地址綁定—bind() </p><p> 建立連接—conn
22、ect()與accept()</p><p> 監(jiān)聽連接—listen() </p><p> 數(shù)據(jù)傳輸—send()/write()與recv()/read() </p><p> 關(guān)閉套接字—close() </p><p><b> 2.錯誤處理</b></p><p> 利用函數(shù)
23、的返回值來判斷函數(shù)執(zhí)行是否正確。</p><p> 使用mysql提供的錯誤號和錯誤信息:</p><p><b> 錯誤號:</b></p><p> unsigned int mysql_errno(MYSQL *mysql)</p><p><b> 錯誤信息:</b></p&g
24、t;<p> char *mysql_error(MYSQL *mysql)</p><p><b> 六: 調(diào)試與測試</b></p><p> 一.生成數(shù)據(jù)庫(source *.sh)</p><p> 二.程序的編譯和運(yùn)行</p><p><b> 編譯:</b><
25、;/p><p> cc –o client client.c -L/usr/lib/mysql –lmysqlclient;</p><p> cc –o middle middle.c -L/usr/lib/mysql –lmysqlclient;</p><p> cc –o bank bank.c -L/usr/lib/mysql –lmysqlclient
26、;</p><p> cc –o meter meter.c -L/usr/lib/mysql –lmysqlclient;</p><p><b> 運(yùn)行:</b></p><p> ./middle middle;</p><p> ./meter Meter;</p><p> .
27、/bank Bank;</p><p> ./client middle myhttp;</p><p> 三.多任務(wù)模式與啟動相關(guān)服務(wù)</p><p><b> 四.相關(guān)操作</b></p><p><b> 現(xiàn)金交易:</b></p><p><b>
28、 網(wǎng)上交易:</b></p><p><b> 查詢:</b></p><p><b> 五.返回結(jié)果信息</b></p><p> 七: 設(shè)計中遇到的問題及解決方法:</p><p> 對Mysql 數(shù)據(jù)庫不夠了解,對很多數(shù)據(jù)結(jié)構(gòu)和算法也理解不夠牢固,因此我們參考了《Linux
29、+php+Mysql基礎(chǔ)與提高》這本書,學(xué)到一些關(guān)于Mysql的基礎(chǔ)知識,才使工作能順利的進(jìn)行下去。</p><p> 對套接字這樣的概念不是很清楚,在老師的輔導(dǎo)和互聯(lián)網(wǎng)的幫助下,了解了一些這方面的知識,才使我們的設(shè)計開展下來。</p><p> 以前對服務(wù)器,客戶端只是了解理論知識,這次而要自己動手來開發(fā)服務(wù)器,這對我們來說,是一個巨大的挑戰(zhàn),服務(wù)器就是一個進(jìn)程,確切的說是一個守候進(jìn)
30、程,要實現(xiàn)它的功能,是不容易的事情,你要學(xué)會套接字,地址轉(zhuǎn)換,服務(wù)器相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法才能進(jìn)行開發(fā)和設(shè)計。</p><p> 還是很多基礎(chǔ)的東西沒有掌握好,基本的算法也沒有完全掌握,參考了教科書的相關(guān)內(nèi)容后,才開始了我們的課程設(shè)計。</p><p> 在數(shù)據(jù)庫的編寫時,很多要用到的數(shù)據(jù)類型而我們又沒有學(xué)過的,只能借助互聯(lián)網(wǎng)的強(qiáng)大功能了,由此,我們也學(xué)到了很多相關(guān)的知識。</p&
31、gt;<p><b> 八: 源程序清單</b></p><p><b> 8.1數(shù)據(jù)庫文件</b></p><p><b> BANK.SH</b></p><p> drop database if exists bank;</p><p> cre
32、ate database bank;</p><p><b> use bank;</b></p><p> create table information</p><p> ( number char(19) not null,passwd char(10),name char(20),money float(10,10));<
33、/p><p> insert into information(number,passwd,name,money)values("061407344","123456","zpf",1000);</p><p> insert into information(number,passwd,name,money)values(&qu
34、ot;061407342","123456","zxl",1000);</p><p> insert into information(number,passwd,name,money)values("061407340","123456","yxl",1000);</p><p&
35、gt;<b> Meter.SH</b></p><p> drop database if exists meter;</p><p> create database meter;</p><p> use meter;</p><p> create table meter(number char(11)
36、,name char(30),money float(10,10));</p><p> insert into meter(number,name,money)values("001","zpf",50);</p><p> insert into meter(number,name,money)values("002",&
37、quot;zxl",22);</p><p> insert into meter(number,name,money)values("003","yxl",20);</p><p><b> MIDDLE.SH</b></p><p> drop database if exists m
38、iddle;</p><p> create database middle;</p><p> use middle;</p><p> create table information(service int,port char(20),ip char(20));</p><p> insert into information
39、(service,port,ip)values(1,"Meter","myhttp");</p><p> insert into information(service,port,ip)values(2,"Bank","myhttp");</p><p><b> USERS.SH</b&
40、gt;</p><p> drop database if exists users;</p><p> create database users;</p><p> use users;</p><p> create table users(name char(20),passwd char(10));</p>&
41、lt;p> insert into users(name,passwd)values("hello","world");</p><p><b> 8.2客戶端程序 </b></p><p><b> Client.C</b></p><p> #include <
42、;stdio.h></p><p> #include <sys/types.h></p><p> #include <sys/socket.h></p><p> #include <netinet/in.h></p><p> #include <sys/un.h></
43、p><p> #include <netdb.h></p><p> #include <unistd.h></p><p> #include <mysql/mysql.h></p><p> #include <fcntl.h></p><p> #includ
44、e <termios.h></p><p> #include <unistd.h></p><p> #include <errno.h></p><p> #define ECHOFLAGS (ECHO | ECHOE | ECHOK | ECHONL)</p><p> int set_dis
45、p_mode(int option);</p><p> int getpasswd(char* passwd, int size);</p><p> int main(int argc,char *argv[])</p><p><b> {</b></p><p> char name[10],passwd
46、[10],choose;</p><p> char send_buf[1024]="";</p><p> char tmp[1024],meter[30],number[30],pswd[10],money[30],myl_buf[1024],fd_buf[1024];</p><p> char log[]="clt.log
47、";</p><p> int connect_fd;</p><p><b> int ret;</b></p><p><b> int i;</b></p><p><b> int port;</b></p><p><b
48、> int len;</b></p><p><b> int fd;</b></p><p> MYSQL mysql;</p><p> MYSQL_ROW row;</p><p> MYSQL_RES *result;</p><p> struct serv
49、ent*sp;</p><p> struct hostent*hp;</p><p> static struct sockaddr_in srv_addr;</p><p> if(mysql_init(&mysql)==NULL){</p><p> fprintf(stderr,"Error in mys
50、ql_init!\n");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(!mysql_real_connect(&mysql,"localhost","root",0,"user
51、s",0,NULL,0)){</p><p> fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_close(&mysql); exit(-2);</p>&l
52、t;p><b> }</b></p><p> system("clear");</p><p> if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){</p><p> fprintf(stderr,"Log file %s open erro
53、r!\a\n",log);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p><b> clear:</b></p><p> printf("Enter the user name:&quo
54、t;);</p><p> scanf("%s",name);</p><p> getchar();</p><p> set_disp_mode(0);</p><p> getpasswd(passwd,sizeof(passwd));</p><p> set_disp_mode(
55、1);</p><p> system("clear");</p><p> sprintf(myl_buf,"select * from users where name=\"%s\"",name);</p><p> if(mysql_query(&mysql,myl_buf)!=0){&
56、lt;/p><p> fprintf(stderr,"Error in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_close(&mysql); exit(-3);</p><p><b> }</b
57、></p><p> if((result=mysql_store_result(&mysql))==NULL){</p><p> fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p>
58、<p> mysql_free_result(result);mysql_close(&mysql); exit(-4);</p><p><b> };</b></p><p> if((mysql_num_rows(result))==0){</p><p> printf("use dont exis
59、t!\n");</p><p> goto clear;</p><p><b> }</b></p><p> row=mysql_fetch_row(result);</p><p> if(strcmp(row[1],passwd)!=0){</p><p> print
60、f("The passwd is not ture\n");</p><p> goto clear;</p><p><b> }</b></p><p> if((sp=getservbyname(argv[1],"tcp"))==NULL){</p><p> fp
61、rintf(stderr,"Error:getservbyname");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if((hp=gethostbyname(argv[2]))==0){</p><p>
62、 fprintf(stderr,"Error:gethostbyname");</p><p><b> exit(-2);</b></p><p><b> }</b></p><p> memset(&srv_addr,0,sizeof(srv_addr));</p>&
63、lt;p> srv_addr.sin_family=AF_INET;</p><p> bcopy(hp->h_addr,&srv_addr.sin_addr,hp->h_length);</p><p> srv_addr.sin_port=sp->s_port;</p><p><b> clen:</b&
64、gt;</p><p> connect_fd=socket(PF_INET,SOCK_STREAM,0);</p><p> if(connect_fd<0){</p><p> perror("cannot create communication socket");</p><p><b>
65、return 1;</b></p><p><b> }</b></p><p> ret=connect(connect_fd,(struct sockaddr*)&srv_addr,sizeof(srv_addr));</p><p> if(ret==-1){</p><p> per
66、ror("cannot connect to the server");</p><p> close(connect_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p> system("cle
67、ar");</p><p> printf("%s login sucessfully\n",name);</p><p> printf("1.cash 2.online\n");</p><p> printf("3.search4.exit\n");</p>&
68、lt;p> printf("Please choose your option :");</p><p> scanf("%c",&choose);</p><p> switch(choose){</p><p><b> case '1':</b></p&g
69、t;<p> printf("Please input your meter number: ");</p><p> scanf("%s",meter);</p><p> printf("Please input the money you want to submit:");</p><
70、;p> scanf("%s",money);</p><p> getchar();</p><p> strcat(send_buf,"3|");strcat(send_buf,meter);strcat(send_buf,"|");</p><p> strcat(send_buf,mon
71、ey);strcat(send_buf,"|1|");</p><p> printf("%s \n",send_buf);</p><p><b> break;</b></p><p><b> case '2':</b></p><p&
72、gt; printf("Please input your meter number:");</p><p> scanf("%s",meter);</p><p> printf("Please input your bank number:");</p><p> scanf("%s&
73、quot;,number);</p><p> getchar();</p><p> set_disp_mode(0);</p><p> getpasswd(pswd,sizeof(pswd));</p><p> set_disp_mode(1);</p><p> printf("\n&qu
74、ot;);</p><p> printf("Please input the money you want to submit:");</p><p> scanf("%s",money);</p><p> getchar();</p><p> strcat(send_buf,"
75、1|");strcat(send_buf,number);strcat(send_buf,"|");</p><p> strcat(send_buf,pswd);strcat(send_buf,"|");</p><p> strcat(send_buf,money);strcat(send_buf,"|");
76、</p><p> strcat(send_buf,meter);strcat(send_buf,"|");</p><p> strcat(send_buf,"2|");</p><p> printf("%s \n",send_buf);</p><p><b&g
77、t; break;</b></p><p> case '3':</p><p> printf("Please Enter your meter number:");</p><p> scanf("%s",meter);</p><p> getchar();
78、</p><p> strcat(send_buf,"4|");strcat(send_buf,meter);</p><p> strcat(send_buf,"|1|");</p><p><b> break;</b></p><p> case '4'
79、;:</p><p> strcpy(send_buf,"3|");</p><p><b> break;</b></p><p> default: ;</p><p><b> }</b></p><p> write(connect_f
80、d,send_buf,strlen(send_buf)+1);</p><p> len=read(connect_fd,send_buf,1024);</p><p><b> if(len>0)</b></p><p> printf("Message from middle: %s\n",send_buf)
81、;</p><p> close(connect_fd);</p><p> switch(send_buf[0]){</p><p><b> case '0':</b></p><p> sprintf(fd_buf,"%-10s%-20s%-20s[0k]\n",name
82、,meter,money);</p><p> write(fd,fd_buf,strlen(fd_buf));</p><p> printf("OPTION SUCCESSFULLY\n");</p><p> printf("Please Enter any key to return...\n");</p&
83、gt;<p> getchar();</p><p> strcpy(send_buf,"");</p><p> goto clen;</p><p><b> break;</b></p><p><b> case '1':</b>&
84、lt;/p><p> printf("the information of the is %s\n",send_buf);</p><p> printf("Please Entry any key to continue...\n");</p><p> getchar();goto clen;</p>&l
85、t;p><b> break;</b></p><p><b> case '3':</b></p><p> sprintf(fd_buf,"%s LOG OUT SUCESSFULLY",meter);</p><p> write(fd,fd_buf,strlen(f
86、d_buf));</p><p> printf("SUCCESSFULLY LOGOUT!\n");</p><p><b> break;</b></p><p><b> case '5':</b></p><p> sprintf(fd_buf,&
87、quot;%-10s%-20s%-20s[FALSE]BANK NUMBER WRONG!\n",name,meter,money);</p><p> write(fd,fd_buf,strlen(fd_buf));</p><p> printf("THE BANK NUMBER IS NOT EXIST\n");</p><p&
88、gt; printf("Please Check it\n");</p><p> printf("please Enter any key to continue...\n");</p><p> getchar();</p><p> strcpy(send_buf,"");goto clen;
89、</p><p><b> case '8':</b></p><p> sprintf(fd_buf,"%-10s%-20s%-20s[FALSE]PHONE NUMBER WRONG!\n",name,meter,money);</p><p> write(fd,fd_buf,strlen(f
90、d_buf));</p><p> printf("THE METER USER ISN'T EXIST\n");</p><p> printf("Please Check it\n");</p><p> printf("Please Enter any key to continue...\n&q
91、uot;);</p><p> getchar();</p><p> strcpy(send_buf,"");goto clen;</p><p><b> break;</b></p><p><b> case '9':</b></p>
92、<p> sprintf(fd_buf,"%-10s%-20s%-20s[FALSE]BANK PASSWD WRONG!\n",name,meter,money);</p><p> write(fd,fd_buf,strlen(fd_buf));</p><p> printf("The passwd wrong\n");&l
93、t;/p><p> printf("Please Enter any key to continue...\n");</p><p> getchar();</p><p> strcpy(send_buf,"");goto clen;</p><p><b> case '7
94、39;:</b></p><p> sprintf(fd_buf,"%-10s%-20s%-20s[FALSE]NOT ENOUGH!\n",name,meter,money);</p><p> write(fd,fd_buf,strlen(fd_buf));</p><p> printf("NOt Enough
95、 MOney\n");</p><p> printf("Please Enter any key to continue...\n");</p><p> getchar();</p><p> strcpy(send_buf,"");goto clen;</p><p> defa
96、ult:break;</p><p><b> }</b></p><p> close(connect_fd);</p><p><b> return 0;</b></p><p><b> }</b></p><p> int set
97、_disp_mode(int option)</p><p><b> {</b></p><p><b> int err;</b></p><p> struct termios term;</p><p> if(tcgetattr(STDIN_FILENO,&term)==-
98、1){</p><p> perror("Cannot get the attribution of the terminal");</p><p><b> return 1;</b></p><p><b> }</b></p><p> if(option)<
99、/p><p> term.c_lflag|=ECHOFLAGS;</p><p><b> else</b></p><p> term.c_lflag &=~ECHOFLAGS;</p><p> err=tcsetattr(STDIN_FILENO,TCSAFLUSH,&term);</p&
100、gt;<p> if(err==-1 && err==EINTR){</p><p> perror("Cannot set the attribution of the terminal");</p><p><b> return 1;</b></p><p><b> }
101、</b></p><p><b> return 0;</b></p><p><b> }</b></p><p> int getpasswd(char* passwd, int size)</p><p><b> {</b></p>&
102、lt;p><b> int c;</b></p><p> int n = 0;</p><p> printf("Enter the passwd:");</p><p><b> do{</b></p><p> c=getchar();</p>
103、<p> // if (c != '\n'|c!='\r'){</p><p> passwd[n++] = c;</p><p><b> // }</b></p><p> }while(c != '\n' && c !='\r'
104、&& n < (size - 1));</p><p> passwd[n-1] = '\0';</p><p><b> return n;</b></p><p><b> }</b></p><p><b> 8.3中間件程序</b
105、></p><p><b> MIDDLE.C</b></p><p> #include <stdio.h></p><p> #include <sys/types.h></p><p> #include <sys/socket.h></p><
106、p> #include <sys/un.h></p><p> #include <errno.h></p><p> #include <unistd.h></p><p> #include <netinet/in.h></p><p> #include <signa
107、l.h></p><p> #include <sys/wait.h></p><p> #include <netdb.h></p><p> #include <string.h></p><p> #include <mysql/mysql.h></p><
108、;p> #include <fcntl.h></p><p> void strsplit(char *s,char **v,char d);</p><p> int main(int argc,char *argv[])</p><p><b> {</b></p><p> int li
109、sten_fd,clt_fd,ser_fd;</p><p> int com_fd;</p><p><b> int ret;</b></p><p><b> int i;</b></p><p><b> int port;</b></p><
110、;p><b> int stat;</b></p><p> pid_t pid;</p><p> char flag,fflag;</p><p> static char recv_buf[1024],snd_buf[1024],buf[1024],ret_buf[1024]="",fd_buf[1024
111、]="";</p><p><b> int len;</b></p><p> char **v,**x,d='|';</p><p><b> int fd;</b></p><p> char log[]="mid.log";&l
112、t;/p><p> MYSQLmysql;</p><p> MYSQL_RES*result;</p><p> MYSQL_ROWrow;</p><p> struct hostent*hp;</p><p> struct servent*sp;</p><p> st
113、ruct sockaddr_in srv_addr;</p><p> struct sockaddr_in clt_addr;</p><p> struct sockaddr_in sc_addr;</p><p> if((fd=open(log,O_WRONLY|O_CREAT|O_APPEND,0644))==-1){</p><
114、p> fprintf(stderr,"Log file %s open error!\a\n",log);</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(mysql_init(&mysql)==NULL){<
115、;/p><p> fprintf(stderr,"Error in mysql_init!\n");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> if(!mysql_real_connect(&mysq
116、l,"localhost","root",0,"middle",0,NULL,0)){</p><p> fprintf(stderr,"Error in connection: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p
117、> mysql_close(&mysql); exit(-2);</p><p><b> }</b></p><p> listen_fd=socket(PF_INET,SOCK_STREAM,0);</p><p> if(listen_fd<0){</p><p> perror(&q
118、uot;cannot create listening socket");</p><p><b> return 1;</b></p><p><b> }</b></p><p> if((sp=getservbyname(argv[1],"tcp"))==NULL){</p&
119、gt;<p> fprintf(stderr,"Error:getservbyname");</p><p><b> exit(-1);</b></p><p><b> }</b></p><p> memset(&srv_addr,0,sizeof(srv_addr)
120、);</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> ret=bind(listen_fd,(str
121、uct sockaddr*)&srv_addr,sizeof(srv_addr));</p><p> if(ret==-1){</p><p> perror("cannot bind server socket");</p><p> close(listen_fd);</p><p><b>
122、 return 1;</b></p><p><b> }</b></p><p> ret=listen(listen_fd,10);</p><p> if(ret==-1){</p><p> perror("cannot listen the client connect requ
123、est");</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> while(1){</b></p><p> f
124、lag='F',fflag='T';</p><p> len=sizeof(clt_addr);</p><p> com_fd=accept(listen_fd,(struct sockaddr*)&clt_addr,&len);</p><p> if(com_fd<0){</p>&l
125、t;p> perror("cannot accept client connect request");</p><p> close(listen_fd);</p><p><b> return 1;</b></p><p><b> }</b></p><p>
126、; if((pid=fork())==-1){</p><p> printf("can't create son proce!\n");</p><p> close(com_fd);</p><p> close(listen_fd);</p><p><b> return 2;</
127、b></p><p><b> }</b></p><p> if(pid==0){</p><p> close(listen_fd);</p><p> if((len=read(com_fd,recv_buf,1024))>0){</p><p> sprintf(fd
128、_buf,"MESSAGE FROM CLIENT:%-40s\n",recv_buf);</p><p> write(fd,fd_buf,strlen(fd_buf)+1);</p><p> printf("Message from client(%d): %s\n",len,recv_buf);</p><p&
129、gt;<b> }</b></p><p> if(recv_buf[len-3]=='3'){</p><p> strcpy(snd_buf,"3|");</p><p> goto zhongjr;</p><p><b> }</b></p
130、><p><b> clen:</b></p><p> len=strlen(recv_buf);</p><p> printf("recv%s\n",recv_buf);</p><p> printf("%d!!!!!!\n",recv_buf[len-2]-48);
131、</p><p> sprintf(buf,"select * from information where service=%d",(recv_buf[len-2]-48));</p><p> if(mysql_query(&mysql,buf)!=0){</p><p> fprintf(stderr,"Error
132、in query: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_close(&mysql); exit(-3);</p><p><b> }</b></p><p> if((result=mysql_store
133、_result(&mysql))==NULL){</p><p> fprintf(stderr,"Error in store_result: %s [%d]\n",mysql_error(&mysql),mysql_errno(&mysql));</p><p> mysql_free_result(result);mysql_close
134、(&mysql); exit(-4);</p><p><b> }</b></p><p> row=mysql_fetch_row(result);</p><p> if((sp=getservbyname(row[1],"tcp"))==NULL){</p><p> fpri
135、ntf(stderr,"Error:getservbyname");</p><p><b> exit(-3);</b></p><p><b> }</b></p><p> if((hp=gethostbyname(row[2]))==0){</p><p> fp
136、rintf(stderr,"Error:gethostbyname");</p><p><b> exit(-4);</b></p><p><b> }</b></p><p> clt_fd=socket(PF_INET,SOCK_STREAM,0);</p><p>
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設(shè)計---電費(fèi)管理系統(tǒng)
- 水電費(fèi)管理系統(tǒng)課程設(shè)計
- c++程序設(shè)計課程設(shè)計--電費(fèi)管理系統(tǒng)
- c++程序設(shè)計課程設(shè)計--電費(fèi)管理系統(tǒng)
- 面向?qū)ο笳n程設(shè)計-高校水電費(fèi)管理系統(tǒng)__
- c++課程設(shè)計高校水電費(fèi)管理系統(tǒng)
- c++課程設(shè)計高校水電費(fèi)管理系統(tǒng)
- 電信銀聯(lián)代繳系統(tǒng)設(shè)計與實現(xiàn).pdf
- 委托代繳協(xié)議
- 代繳社保協(xié)議
- 代繳保險協(xié)議
- 委托代繳社保
- 某銀行代繳燃?xì)赓M(fèi)系統(tǒng)設(shè)計與實現(xiàn).pdf
- 社保代繳證明
- 銀行電費(fèi)代收代扣系統(tǒng)的設(shè)計與實現(xiàn).pdf
- 代繳社保協(xié)議 (3)
- 北京社保代繳協(xié)議
- 代繳社保協(xié)議 (2)
- 代繳社保免責(zé)聲明
- 楚雄地稅代征代繳管理系統(tǒng)的設(shè)計與實現(xiàn).pdf
評論
0/150
提交評論