版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 《軟件實習2》任務書</p><p> 設計題目 電費代繳系統(tǒng) </p><p> 學生班級 </p><p> 學生學號 </p><p> 學生姓名 </p>
2、<p> 同 組 人 </p><p> 指導老師 </p><p><b> 目錄</b></p><p> 《軟件實習2》任務書- 0 -</p><p> 一: 前言- 2 -</
3、p><p> 二: 系統(tǒng)環(huán)境- 2 -</p><p> 三: 設計目的- 2 -</p><p> 四: 總體設計- 3 -</p><p> 1.客戶端頁面- 3 -</p><p> 2.客戶端,中間件和服務器聯(lián)系- 3 -</p><p> 五: 詳細設計- 4 -&
4、lt;/p><p> (1)基本功能- 4 -</p><p> 1.1查詢費用- 4 -</p><p> ?。?) 服務器的開發(fā)- 4 -</p><p> 2.1服務端的開發(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> 二.程序的編譯和運行- 6 -</p><p> 三.多任務模式與啟動相關服務- 6 -</p><p> 四.相關操作- 7 -</p><
6、;p> 五.返回結果信息- 8 -</p><p> 七: 設計中遇到的問題及解決方法:- 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服務器- 22 -</p><p> 8.5服務器- 27 -</p><p> 九: 心得體會- 32 -</p><p> 十:參考文獻- 33 -</p><p><b> 電費代繳系統(tǒng)</b></p><p><b>
8、; 一: 前言</b></p><p> 近年來,隨著高科技技術的告訴發(fā)展,傳統(tǒng)的手工操作系統(tǒng)為主的電費繳納的管理方式,因其信息反應慢,工作效率低,管理質(zhì)量差,備受廣大服務者爭議。在計算機信息技術飛速發(fā)展與廣泛應用的今天,這種落后的管理方式與時代的步伐已顯得格格不入,對電費繳納系統(tǒng)實現(xiàn)智能化,信息管理化,是信息時代對現(xiàn)代社會電費管理工作提出的嚴峻要求。為了更好的提供電費代繳服務,為了使電費管理更加
9、科學,更嚴謹,同時更具有操作性,節(jié)省操作人員的勞動,電費繳納系統(tǒng)必須與先進技術相結合,應用先進的網(wǎng)絡管理技術來操作電費管理系統(tǒng),從而使其為人們提供更方便,更快捷的電費管理服務。</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)絡的底層進行開發(fā)設計。</p><p> 電費繳費系統(tǒng)是基于UNIX Socket和MySQL數(shù)據(jù)庫設計一個交易型中間件系統(tǒng)。在Linux環(huán)境下使用GNU C或者GNU C++,在Linux make開發(fā)工具的管理和控制下,利用Linux系統(tǒng)提供的Socket庫和MySQL數(shù)據(jù)庫在網(wǎng)絡底層開發(fā)交易型中間件,同時簡要介紹了客戶端和服務器的工作模式。此模擬電費交費系統(tǒng)采用“客戶端—
11、中間件—服務器”模式,其中主要包括三大部分: 客戶端(Client),中間件(Middleware)和服務器端(Server)??蛻舳?Client)主要實現(xiàn)用戶管理、查詢、交易(交費,購物等),撤銷和統(tǒng)計等功能;中間件(Middleware)要完成與客戶要求相符的功能——是本地的本地處理,否則發(fā)往服務器端——接受客戶端數(shù)據(jù),組織服務器端所需數(shù)據(jù),重組服務端返回數(shù)據(jù),并返回給客戶方;服務器端(Server)主要實現(xiàn)客戶端或中間件提出的業(yè)
12、務請求并做好留跡工作</p><p><b> 三: 設計目的</b></p><p> 對電費查詢與繳費業(yè)務進行了系統(tǒng)全面的分析研究。針對現(xiàn)有系統(tǒng)中實時性不足而造成用戶欠費太多使公司企業(yè)蒙受損失的問題。采用開發(fā)工具Linux+Mysql進行系統(tǒng)設計。設計系統(tǒng)能夠提供對點費信息輸入、查詢、編輯、打印以及話費統(tǒng)計各明細項目的數(shù)據(jù)編輯,自動計算出電費的各項合計數(shù)據(jù);可
13、自主設定條件從而達到數(shù)據(jù)的多角度查詢功能;方便導入、導出數(shù)據(jù)及輸出報表。</p><p><b> 四: 總體設計</b></p><p><b> 1.客戶端頁面</b></p><p> 2.客戶端,中間件和服務器聯(lián)系</p><p><b> 五: 詳細設計</b>
14、;</p><p><b> ?。?)基本功能</b></p><p><b> 1.1查詢費用 </b></p><p> 客戶到柜臺繳納費用,客戶首先用賬號及密碼登陸系統(tǒng),然后登陸電表序列號和銀行賬號,中間件根據(jù)用戶提供的電表序列號碼把“查詢費用”指令存入數(shù)據(jù)庫。中間件檢測到查詢費用指令,把查詢費用指令組成數(shù)據(jù)包發(fā)
15、送到服務器中。服務器把查詢費用的結果返回中間件,確認信息后,從接收表中檢測返回結果中間件,并監(jiān)控因錯誤操作并返回結果。 服務器從接收表中查詢到“查詢費用”指令,把查詢費用指令填入數(shù)據(jù)庫.得到查詢費用指令后從主數(shù)據(jù)庫查詢用戶的費用信息。服務器如果因錯誤沒有得到查詢結果,把返回結果系統(tǒng)錯誤,并顯示出來。 1.2繳納費用 </p><p> 客戶端發(fā)出“繳納費用”指令存入中間件。中間件檢測到“繳納費用”指令,把“繳
16、納費用”指令組成數(shù)據(jù)包放入緩沖區(qū),然后發(fā)送給服務器。 服務器把“繳納費用”的指令填入接收,并返回確認信息。中間件在得到確認信息后,從接收表中檢測返回結果給客戶端,并監(jiān)控錯誤無返回結果的情況。 服務器從接收表中查詢到“繳納費用”指令,把“繳納費用”指令填入數(shù)據(jù)庫。得到“繳納費用” 后從主數(shù)據(jù)庫進行處理,并把銀行數(shù)據(jù)庫中所繳的費用扣除,結果填入數(shù)據(jù)庫。 “服務器處理系統(tǒng)”如果因為錯誤沒有得到結果,把返回結果“系統(tǒng)錯誤”填入發(fā)送錯誤信息給中間
17、件,然后中間件把信息返回給用戶。 1.3 查詢信息</p><p> 通過用戶名和電表序列號進行查詢,錄入正確則返回用戶信息,反之,退出系統(tǒng)。1.4 退出系統(tǒng)</p><p> 客戶端發(fā)送退出系統(tǒng)請求,經(jīng)中間件確認。然后客戶端退出系統(tǒng)并關閉連接。</p><p> (2) 服務器的開發(fā)</p><p><b> 2.
18、1服務端的開發(fā)</b></p><p> 服務器主要包含守候進程(daemon),也叫精靈進程,或服務器進程,是生存期長的一種進程。它們常常在系統(tǒng)引導裝入時起動,在系統(tǒng)關閉時終止。因為它們沒有控制終端,所以說它們是在后臺運行的。它等待客戶機與其聯(lián)系,提出某種類型的服務要求。服務對客戶機服務可將結果或信息返回給客戶機(雙向),也可不返回(單向)。</p><p> 2.2 客
19、戶端的開發(fā)</p><p> 打開一通信通道,并連接到服務器所在主機的特定端口。向服務器發(fā)服務請求,等待并接收應答;請求結束后關閉通信通道。</p><p> 客戶是交易的發(fā)起者。實現(xiàn)功能與服務器方同。</p><p><b> 2.3套接字 </b></p><p> 1.流式套接字(SOCK-STREAM):
20、</p><p> 提供了一個面向連接、可靠的數(shù)據(jù)傳輸服務,數(shù)據(jù)無差錯、無重復地發(fā)送,且按發(fā)送順序接收。內(nèi)設流量控制,避免數(shù)據(jù)流超限;數(shù)據(jù)被看作是字節(jié)流,無長度限制。文件傳送協(xié)議(FTP)即使用流式套接字。</p><p> 數(shù)據(jù)報式套接字(SOCK-DGRAM) :提供了一個無連接服務。數(shù)據(jù)包以獨立包形式被發(fā)送,不提供無錯保證,數(shù)據(jù)可能丟失或重復,并且接收順序混亂。</p>
21、;<p> 原始式套接字(SOCK-RAW):該接口允許對較低層協(xié)議,如IP、ICMP直接訪問。常用于檢驗新的協(xié)議實現(xiàn)或訪問現(xiàn)有服務中配置的新設備。</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> 關閉套接字—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> 二.程序的編譯和運行</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> 運行:</b></p><p> ./middle middle;</p><p> ./meter Meter;</p><p> .
27、/bank Bank;</p><p> ./client middle myhttp;</p><p> 三.多任務模式與啟動相關服務</p><p><b> 四.相關操作</b></p><p><b> 現(xiàn)金交易:</b></p><p><b>
28、 網(wǎng)上交易:</b></p><p><b> 查詢:</b></p><p><b> 五.返回結果信息</b></p><p> 七: 設計中遇到的問題及解決方法:</p><p> 對Mysql 數(shù)據(jù)庫不夠了解,對很多數(shù)據(jù)結構和算法也理解不夠牢固,因此我們參考了《Linux
29、+php+Mysql基礎與提高》這本書,學到一些關于Mysql的基礎知識,才使工作能順利的進行下去。</p><p> 對套接字這樣的概念不是很清楚,在老師的輔導和互聯(lián)網(wǎng)的幫助下,了解了一些這方面的知識,才使我們的設計開展下來。</p><p> 以前對服務器,客戶端只是了解理論知識,這次而要自己動手來開發(fā)服務器,這對我們來說,是一個巨大的挑戰(zhàn),服務器就是一個進程,確切的說是一個守候進
30、程,要實現(xiàn)它的功能,是不容易的事情,你要學會套接字,地址轉換,服務器相關的數(shù)據(jù)結構和算法才能進行開發(fā)和設計。</p><p> 還是很多基礎的東西沒有掌握好,基本的算法也沒有完全掌握,參考了教科書的相關內(nèi)容后,才開始了我們的課程設計。</p><p> 在數(shù)據(jù)庫的編寫時,很多要用到的數(shù)據(jù)類型而我們又沒有學過的,只能借助互聯(lián)網(wǎng)的強大功能了,由此,我們也學到了很多相關的知識。</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)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 課程設計---電費管理系統(tǒng)
- 水電費管理系統(tǒng)課程設計
- c++程序設計課程設計--電費管理系統(tǒng)
- c++程序設計課程設計--電費管理系統(tǒng)
- 面向對象課程設計-高校水電費管理系統(tǒng)__
- c++課程設計高校水電費管理系統(tǒng)
- c++課程設計高校水電費管理系統(tǒng)
- 電信銀聯(lián)代繳系統(tǒng)設計與實現(xiàn).pdf
- 委托代繳協(xié)議
- 代繳社保協(xié)議
- 代繳保險協(xié)議
- 委托代繳社保
- 某銀行代繳燃氣費系統(tǒng)設計與實現(xiàn).pdf
- 社保代繳證明
- 銀行電費代收代扣系統(tǒng)的設計與實現(xiàn).pdf
- 代繳社保協(xié)議 (3)
- 北京社保代繳協(xié)議
- 代繳社保協(xié)議 (2)
- 代繳社保免責聲明
- 楚雄地稅代征代繳管理系統(tǒng)的設計與實現(xiàn).pdf
評論
0/150
提交評論