嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告格式_第1頁
嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告格式_第2頁
嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告格式_第3頁
嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告格式_第4頁
嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告格式_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費(fèi)閱讀

付費(fèi)下載

下載本文檔

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

文檔簡介

安徽工業(yè)大學(xué)電氣信息學(xué)院嵌入式系統(tǒng)及應(yīng)用綜合實(shí)驗(yàn)報(bào)告Linux系統(tǒng)下TFTP和QT下聊天程序設(shè)計(jì)姓名:劉洪方學(xué)號(hào):109104069專業(yè):工商管理年級(jí):1指導(dǎo)教師:馬小陸2011年6月

一、課程設(shè)計(jì)項(xiàng)目介紹(含項(xiàng)目介紹及設(shè)計(jì)目的)(四號(hào)宋體,頁數(shù)不夠可另加,排版要工整規(guī)范,如每個(gè)大標(biāo)題應(yīng)位于頁首等等,以下類同)1.項(xiàng)目介紹: TFTP:是一個(gè)服務(wù)器客戶端網(wǎng)絡(luò)程序,以提供簡單文件共享服務(wù)器,支持下載,列出文件目錄和上傳文件功能。 QT:是一個(gè)簡單的服務(wù)器客戶端聊天程序,以提供簡單的數(shù)據(jù)通信。2、設(shè)計(jì)目的:TFTP:是為提供一個(gè)可以為網(wǎng)絡(luò)使用者提供文件共享簡單的功能的使用。方便網(wǎng)絡(luò)間文件的訪問和使用。QT:是一個(gè)支持雙方簡單聊天功能的程序。 兩者都幫助我們鍛煉理念知識(shí)和實(shí)踐能力。二、總體設(shè)計(jì)(含系統(tǒng)的總體結(jié)構(gòu)、原理框圖或各模塊介紹等)三、詳細(xì)設(shè)計(jì)(含主要的數(shù)據(jù)結(jié)構(gòu)、程序流程圖、關(guān)鍵代碼段及注釋等)(四號(hào)宋體,框圖文字用小五宋體)以下是各代碼的解釋,介紹,原理,流程圖:TFTP服務(wù)器:開始開始配置網(wǎng)絡(luò)參數(shù)待客戶端連接有連接接收發(fā)來的命令到緩沖區(qū)第一個(gè)字符列出服務(wù)器文件目錄接收客戶端上傳的文件向客戶端發(fā)送要下載的文件是等待客戶端連接否LPG#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<dirent.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#defineN128typedefstructsockaddrSA;ProcessList過程:利用一個(gè)循環(huán)獲得目錄中所有的文件,并把文件名發(fā)送到客戶端,最終把所有文件表發(fā)送到客戶端。完成此列出文件目錄功能voidProcessList(intconnfd){ charbuf[N]; DIR*mydir; structdirent*myitem; mydir=opendir("."); while((myitem=readdir(mydir))!=NULL) { if((strcmp(myitem->d_name,".")==0)||(strcmp(myitem->d_name,"..")==0))continue; strcpy(buf,myitem->d_name); send(connfd,buf,N,0); } closedir(mydir); return;}ProcessGet過程:首先打開需要下載的客戶端發(fā)來命令中的文件名文件,然后如果打開成功則向客戶端發(fā)送Y,客戶端準(zhǔn)備接收,然后服務(wù)器以128為單位讀取數(shù)據(jù),發(fā)送數(shù)據(jù),最終把一個(gè)文件所有內(nèi)容發(fā)送給客戶端。完成下載功能。voidProcessGet(intconnfd,charbuf[]){ intfd,nbyte; if((fd=open(buf+1,O_RDONLY))<0) { fprintf(stderr,"failtoopen%s:%s\n",buf+1,strerror(errno)); buf[0]='N'; send(connfd,buf,N,0); return; } buf[0]='Y'; send(connfd,buf,N,0); while((nbyte=read(fd,buf,N))>0) { send(connfd,buf,nbyte,0); } close(fd); return;}ProcessPut過程:首先創(chuàng)建客戶端發(fā)來命令中的文件名文件,然后如果打開成功則向客戶端發(fā)送Y,客戶端準(zhǔn)備發(fā)送,客戶端以128為單位讀取數(shù)據(jù),發(fā)送數(shù)據(jù),每發(fā)送一段,服務(wù)器寫入這部分內(nèi)容,最終把一個(gè)文件所有內(nèi)容發(fā)送給服務(wù)器。完成上傳功能。voidProcessPut(intconnfd,charbuf[]){ intfd,nbyte; if((fd=open(buf+1,O_WRONLY|O_CREAT|O_TRUNC,0666))<0) { printf("failtocreate%sonserver\n",buf+1); return; } while((nbyte=recv(connfd,buf,N,0))>0) { write(fd,buf,nbyte); } close(fd); return;}Main過程:首先初始化所有網(wǎng)絡(luò)參數(shù)等待客戶端的連接,然后以一個(gè)循環(huán)來接收客戶端發(fā)來的命令首字符,并跟據(jù)這個(gè)來執(zhí)行對(duì)應(yīng)的操作。intmain(intargc,char*argv[]){intlistenfd,connfd; charbuf[N];structsockaddr_inserver_addr;//XXX:step1intsocket(intdomain,inttype,intprotocol);if((listenfd=socket(PF_INET,SOCK_STREAM,0))<0){fprintf(stderr,"failtosocket:%s\n",strerror(errno));exit(-1);}#ifdef_DEBUG_printf("socketis%d\n",listenfd);#endif//XXX:step2intbind(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=PF_INET;server_addr.sin_port=htons(8888);server_addr.sin_addr.s_addr=htonl(INADDR_ANY); if(bind(listenfd,(SA*)&server_addr,sizeof(server_addr))<0) { perror("failtobind"); exit(-1); } listen(listenfd,5);while(1) { if((connfd=accept(listenfd,NULL,NULL))<0) { perror("failtoaccept"); break; } recv(connfd,buf,N,0); switch(buf[0]) { case'L': ProcessList(connfd); break; case'G': ProcessGet(connfd,buf); break; case'P': ProcessPut(connfd,buf); break; } close(connfd); }return0;}TFTP客戶端:開始開始配置網(wǎng)絡(luò)連接參數(shù)前四個(gè)字符列出服務(wù)器文件目錄接收客戶端上傳的文件向客戶端發(fā)送要下載的文件ListPutGet從鍵盤獲得命令打印操作幫助helpTFTP客戶端:#include<stdio.h>#include<stdlib.h>#include<unistd.h>#include<string.h>#include<fcntl.h>#include<sys/types.h>/*SeeNOTES*/#include<sys/socket.h>#include<netinet/in.h>#include<arpa/inet.h>#include<errno.h>#defineN128typedefstructsockaddrSA;Printhelp過程:打印所有的操作幫助。voidPrintHelp(){printf("help:displayhelpinfo\n");printf("list:getfilelistofserver\n");printf("get:get<file>\n");printf("put:put<file>\n"); printf("quit:quittheclient\n"); return;}ProcessList過程:首先利用配置好的網(wǎng)絡(luò)參數(shù)連接服務(wù)器,然后向服務(wù)器發(fā)送“L”命令,最后利用一個(gè)循環(huán)接收目錄中所有的文件名,并打印文件名,最終把所有文件表發(fā)送到客戶端。完成此列出文件目錄功能voidProcessList(structsockaddr_inserver_addr){ intsockfd,nbyte; charbuf[N]; if((sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { printf("failtolist\n"); return; } if(connect(sockfd,(SA*)&server_addr,sizeof(server_addr))<0){printf("failtoconnectserver\n"); gotoERROR_1;} strcpy(buf,"L"); send(sockfd,buf,N,0);while((nbyte=recv(sockfd,buf,N,0))!=0) { printf("%s\n",buf); }ERROR_1: close(sockfd); return;}ProcessGet過程:首先利用配置好的網(wǎng)絡(luò)參數(shù)連接服務(wù)器,然后向服務(wù)器發(fā)送“G”命令并附上需要處理的文件名,創(chuàng)建需要下載的命令中的文件名文件,客戶端準(zhǔn)備接收,然后服務(wù)器以128為單位讀取數(shù)據(jù),寫入數(shù)據(jù),最終把一個(gè)文件所有內(nèi)容接收到客戶端。完成下載功能。voidProcessGet(structsockaddr_inserver_addr,charcommand[]){ intsockfd,nbyte,fd;charbuf[N]; if((sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { printf("failtoget\n"); return; } if(connect(sockfd,(SA*)&server_addr,sizeof(server_addr))<0){printf("failtoconnectserver\n"); gotoERROR_2;} sprintf(buf,"G%s",command+4); send(sockfd,buf,N,0);recv(sockfd,buf,N,0); if(buf[0]=='N')//nosuchfile { printf("Nosuchfileonserver\n"); gotoERROR_2; }if((fd=open(command+4,O_WRONLY|O_CREAT|O_TRUNC,0666))<0) { printf("failtocreatelocalfile%s\n",command+4); gotoERROR_2; } while((nbyte=recv(sockfd,buf,N,0))>0) { write(fd,buf,nbyte); } close(fd);ERROR_2: close(sockfd); return;}ProcessGet過程:首先利用配置好的網(wǎng)絡(luò)參數(shù)連接服務(wù)器,然后向服務(wù)器發(fā)送“P”命令并附上需要處理的文件名,打開需要上傳的命令中的文件名文件,客戶端準(zhǔn)備發(fā)送,然后服務(wù)器以128為單位讀取數(shù)據(jù),發(fā)送數(shù)據(jù),最終把一個(gè)文件所有內(nèi)容發(fā)送到服務(wù)器上。完成上傳功能。voidProcessPut(structsockaddr_inserver_addr,charcommand[]){ intsockfd,fd,nbyte; charbuf[N];if((sockfd=socket(PF_INET,SOCK_STREAM,0))<0) { printf("failtoget\n"); return; } if(connect(sockfd,(SA*)&server_addr,sizeof(server_addr))<0){printf("failtoconnectserver\n"); gotoERROR_3;}if((fd=open(command+4,O_RDONLY))<0) { printf("failtoopen%s\n",command+4); gotoERROR_3; } sprintf(buf,"P%s",command+4); send(sockfd,buf,N,0); while((nbyte=read(fd,buf,N))>0) { send(sockfd,buf,nbyte,0); } close(fd);ERROR_3: close(sockfd); return;}Main過程:首先初始化所有網(wǎng)絡(luò)連接參數(shù)等待過程的使用,然后以一個(gè)循環(huán)來接收鍵盤的命令前四個(gè)字符,并跟據(jù)這個(gè)來執(zhí)行對(duì)應(yīng)的操作。并把鍵入的字符為參數(shù)傳給過程函數(shù)。intmain(intargc,char*argv[]){intsockfd,fd,nbyte;charcommand[32];structsockaddr_inserver_addr;if(argc<3) { printf("Usage:%s<server_ip>:<port>\n",argv[0]); exit(-1); } //XXX:step1intsocket(intdomain,inttype,intprotocol);if((sockfd=socket(PF_INET,SOCK_STREAM,0))<0){fprintf(stderr,"failtosocket:%s\n",strerror(errno));exit(-1);}#ifdef_DEBUG_printf("socketis%d\n",sockfd);#endif//XXX:step2intconnect(intsockfd,conststructsockaddr*serv_addr,socklen_taddrlen);memset(&server_addr,0,sizeof(server_addr));server_addr.sin_family=PF_INET;server_addr.sin_port=htons(atoi(argv[2]));server_addr.sin_addr.s_addr=inet_addr(argv[1]);//server_addr.sin_addr.s_addr=htonl(INADDR_ANY); while(1) {printf("<client>"); fgets(command,32,stdin); command[strlen(command)-1]='\0';//overwritethe'\n' if(strcmp(command,"help")==0) { PrintHelp(); } elseif(strcmp(command,"list")==0) { ProcessList(server_addr); } elseif(strncmp(command,"get",4)==0) { ProcessGet(server_addr,command); } elseif(strncmp(command,"put",4)==0) { ProcessPut(server_addr,command); } elseif(strcmp(command,"quit")==0) { printf("Bye\n"); break; } else { printf("wrongcommand,'help'forcommandlist\n"); } }return0;}QT服務(wù)器:開始開始配置網(wǎng)絡(luò)參數(shù)待客戶端連接有連接是等待客戶端連接否接收數(shù)據(jù),并把它寫入到listWidgeton_pushButton_clicked過程:當(dāng)pushButton按下去時(shí),則啟動(dòng)服務(wù)器初始化網(wǎng)絡(luò)并監(jiān)聽,等待客戶端連接。voidDialog::on_pushButton_clicked(){server=newServer(port);connect(server,SIGNAL(updateServer(QString,int)),this,SLOT(Process_updateServer(QString,int)));ui->pushButton->setEnabled(false);}Process_updateServer過程:當(dāng)接收到客戶端發(fā)來的數(shù)據(jù)時(shí),則把它顯示在listWidget中。voidDialog::Process_updateServer(QStringmsg,intlength){ui->listWidget->addItem(msg.left(length));}QT客戶端:開始開始配置網(wǎng)絡(luò)連接參數(shù)并鍵入到各文本框中然后按下EnterChatRoomBtn成功連接是否接收窗口信號(hào)把Send_lineEdit內(nèi)容發(fā)到服務(wù)器sendBtn按下接收服務(wù)器發(fā)來信息并加入Client_listWidget內(nèi)on_EnterChatRoomBtn_clicked過程:當(dāng)EnterChatRoomBtn按下去時(shí),則啟動(dòng)服務(wù)器連接參數(shù)初始化并連接SeverIP_lineEdit指的服務(wù)器。voidDialog::on_EnterChatRoomBtn_clicked(){if(!status){QStringip=ui->SeverIP_lineEdit->text();if(!serverIP->setAddress(ip)){QMessageBox::information(this,"error","serverIPaddresserror!");return;}if(ui->User_lineEdit->text()==""){QMessageBox::information(this,"error","userNameerror!");return;}userName=ui->User_lineEdit->text();tcpSocket->connectToHost(ui->SeverIP_lineEdit->text(),port);//tcpSocket->connectToHost(*serverIP,port);//tcpSocket->connectToHost(QHostAddress::LocalHost,port);if(tcpSocket->waitForConnected(1000))qDebug("Connected!");status=true;}else{intlength=0;QStringmsg=userName+":LeaveChatRoom!";if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length()){return;}tcpSocket->disconnectFromHost();status=false;}}process_connected過程:連接成功時(shí),則發(fā)送“enterchatroom”并附上用戶名發(fā)送到服務(wù)器。voidDialog::process_connected(){QMessageBox::information(this,"error","eeeeeeeeeeeeeeeee!");ui->sendBtn->setEnabled(true);ui->EnterChatRoomBtn->setText("leave");intlength=0;QStringmsg=userName+"enterchatroom!";if((length=tcpSocket->write(msg.toLatin1(),msg.length()))!=msg.length()){return;}}slotdisconnected過程:取消連接,使sendBtn有效voidDialog::slotdisconnected(){ui->sendBtn->setEnabled(false);ui->EnterChatRoomBtn->setText("EnterChatRoom");}dataReceived過程:當(dāng)服務(wù)器數(shù)據(jù)來到時(shí),把數(shù)據(jù)加入到Client_listWidget內(nèi)。voidDialog::dataReceived(){while(tcpSocket->bytesAvailable()>0){QByteArraydatadram;datadram.resize(tcpSocket->bytesAvailable());//QHostAddresssender;tcpSocket->read(datadram.data(),datadram.size());QStringmsg=datadram.data();ui->Client_listWidget->addItem(msg.left(datadram.size()));}}on_sen

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論