2023年全國碩士研究生考試考研英語一試題真題(含答案詳解+作文范文)_第1頁
已閱讀1頁,還剩37頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論