計算機網(wǎng)絡(luò)課程設(shè)1ftp_第1頁
計算機網(wǎng)絡(luò)課程設(shè)1ftp_第2頁
計算機網(wǎng)絡(luò)課程設(shè)1ftp_第3頁
計算機網(wǎng)絡(luò)課程設(shè)1ftp_第4頁
計算機網(wǎng)絡(luò)課程設(shè)1ftp_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、成績 中國農(nóng)業(yè)大學(xué)課程論文(2008-2009學(xué)年 春季 學(xué)期)課程名稱:計算機網(wǎng)絡(luò)課程設(shè)計 任課教師: 楊 璐 班級: 學(xué)號: 姓名: 計算機網(wǎng)絡(luò)課程設(shè)計課程設(shè)計名稱:ftp 客戶端軟件課程設(shè)計目的:1. 通過ftp客戶端軟件加深對網(wǎng)絡(luò)傳輸?shù)睦斫狻?. 了解網(wǎng)絡(luò)傳輸?shù)膶崿F(xiàn)方法3. 學(xué)習(xí)ftp協(xié)議4. 通過ftp程序的編寫,了解協(xié)議在網(wǎng)絡(luò)中不可替代的作用課程設(shè)計要求:客戶端程序具有文件列表、下載文件、上傳文件等常用功能。因為ftp協(xié)議比較復(fù)雜,為了簡單起見,客戶端只實現(xiàn)ftp客戶端協(xié)議的一個子集。具有以下幾個功能:l l連接到指定的ftp服務(wù)器;l l斷開和主機的連接;l l進入子目錄;l l

2、退出子目錄;l l列出服務(wù)器當(dāng)前目錄下的所有文件l l從服務(wù)器下載指定的文件到本地(可以同時指定多個文件連續(xù)下載)l l從本地上傳指定的文件到服務(wù)器用戶界面應(yīng)該能夠為程序輸入下面的信息:l l服務(wù)器主機名l l用戶名、口令l l數(shù)據(jù)的傳送類型l l要進入的服務(wù)器目錄l l要下載的遠程文件名 l l要上載的本地文件名和遠程文件名 同時,界面也為用戶輸出以下的信息:l lftp服務(wù)器上的文件和目錄列表l l從服務(wù)器返回的應(yīng)答課程設(shè)計軟件環(huán)境:操作系統(tǒng):windows xp sp3使用語言:c+使用平臺:vs2005使用庫:lib-ws2_32,winsock.h,fstream,iostream,

3、errno.h,time.h,string,windows.h課程設(shè)計與調(diào)試的硬件環(huán)境:cpu:p core2 7200內(nèi)存:2g硬盤空間:250g網(wǎng)卡:10/100m/1000m自適應(yīng)網(wǎng)卡課程設(shè)計原理:1.簡介ftp 文件傳輸協(xié)議,提供的是文件傳輸服務(wù),c/s的方式進行網(wǎng)絡(luò)訪問,端口號一般為21。支持密名訪問的ftp都包含一個anonymous用戶,使用anonymous登陸后只需輸入e-mail即可登錄。用戶登錄后即可進行文件操作,本次課程設(shè)計我采用的是命令行方式的操作界面。對文件的操作需要使用指定命令(如列目錄使用list)。根據(jù)命令性質(zhì)的不同對兩類命令進行分析1) 簡單的無數(shù)據(jù)傳輸方式

4、:以cwd為例:client-setcommand(cwd ,direct);命令格式規(guī)范化,例如要進入根目錄下的tools目錄就可使命令規(guī)范化為”cwd/toolsrn”(其中代表一個空格)。請注意這里的字符串一個字符都不能差,更詳細的說明參見rfc959文檔,內(nèi)有詳細說明。client-sendcommand();sendcommand()即為發(fā)送規(guī)范化的命令。client-receivecommand();接收應(yīng)答信息并分離應(yīng)答碼。2) 復(fù)雜的有數(shù)據(jù)傳輸方式:帶有數(shù)據(jù)傳輸?shù)奈募枰?shù)據(jù)套接字來傳輸,建立數(shù)據(jù)套接字的方式有兩種,主動模式,被動模式。簡單的介紹下這兩種模式:a. 主動模式

5、:主動模式是客戶端發(fā)送數(shù)據(jù)連接請求,并告知服務(wù)器端已開放的正在監(jiān)聽的端口,由服務(wù)器發(fā)送連接請求,建立連接。b. 被動模式:被動模式是發(fā)送被動連接模式命令,服務(wù)器由應(yīng)答碼返回可用的ip與端口信息,通過對應(yīng)答碼的分析找到端口號,用客戶端連接正在監(jiān)聽的服務(wù)器端口。由于主動模式的局限性,即在有nat轉(zhuǎn)換時無法將信息送至正確的位置,因為經(jīng)過nat技術(shù)轉(zhuǎn)換的端口號代表的是一臺計算機的內(nèi)網(wǎng)編號,而不是計算機網(wǎng)絡(luò)端口的端口號,所以無法正確送達。也因此本程序采用被動模式。當(dāng)數(shù)據(jù)鏈路建立完成后,數(shù)據(jù)鏈路需要進行初始化,數(shù)據(jù)鏈路有兩種常用的模式,ascii方式和二進制方式,下面介紹下這兩種傳輸方式:a. ascii

6、方式:ascii方式傳輸數(shù)據(jù)時,數(shù)據(jù)以一個字符一個字符為單位傳輸,這種方式一般使用在文本文件等一些使用ascii碼來儲存信息的文件傳輸中ascii方式同樣用于文件目錄列表的傳輸。使用ascii方式傳輸二進制文件,例如可執(zhí)行文件,圖片文件,動畫文件,等等,會使文件損壞。b. 二進制方式:二進制文件傳輸數(shù)據(jù)時,數(shù)據(jù)以比特為單位傳輸,到達客戶端后,由操作系統(tǒng)將其合并轉(zhuǎn)換。使用2進制可以傳輸絕大多數(shù)的文件,但是二進制方式也有其不可避免的局限性,二進制傳輸文件要求服務(wù)器和客戶端使用相同類型的操作系統(tǒng),如果不同類型下載的文件無法使用,但可以使用二進制方式傳輸?shù)搅硪慌_擁有相同操作系統(tǒng)的機器上,文件可以使用。

7、所以二進制方式傳輸同樣不適用于網(wǎng)絡(luò)傳輸。確定了傳輸類型后,就可以創(chuàng)建套接字,格式化命令,發(fā)送命令,并接受信息和應(yīng)答碼與兩不同的socket上。char* filename = new char512;memset(filename,null,512);/*pasv方式傳輸*/client-setcommand(pasv);client-sendcommand();client-receivecommand();/*分析應(yīng)答碼取端口號*/client-getport();/*設(shè)置傳輸類型初始化數(shù)據(jù)套接字*/client-setcommand(type ,i);client-sendcommand

8、();client-receivecommand();client-interlizedatasocket();coutfilename;memset(temp,null,512);/*格式化路徑信息direct*/memcpy(temp,direct,strlen(direct);memcpy(temp+strlen(direct),/,1);memcpy(temp+strlen(direct)+strlen(/),filename,strlen(filename);/*格式化命令retr*/client-setcommand(retr ,temp);client-sendcommand()

9、;client-receivecommand();/*接收數(shù)據(jù)信息和應(yīng)答信息*/client-receivedata(filename);client-receivecommand();/*清理內(nèi)存*/delete filename;其他命令只需對以上兩種類型命令的模型稍加改動即可詳情請參照以上注釋閱覽源程序。下面對我封裝的這個ftp類進行剖析。2.封裝類分析ftp客戶端主要有一個類ftpclient來完成封裝,具體的成員包括成員函數(shù):private:ftpclient:getcode前提條件:cmdbuffer中尚存有pasv命令的應(yīng)答信息用于獲取cmdbuffer中的端口信息并進行轉(zhuǎn)換ft

10、pclient:interlizedatasocket 初始化控制連接public:ftpclient:ftpclientftpclient的析構(gòu)函數(shù),包含釋放緩沖區(qū)的任務(wù)。ftpclient:ftpclient ftpclient的構(gòu)造函數(shù),初始化緩沖區(qū),調(diào)用interlizesocket()函數(shù)初始化控制連接。ftpclient:receivecommand 接收控制信息應(yīng)答碼ftpclient:receivedata接收數(shù)據(jù)鏈路信息ftpclient:receivelist接收列表信息ftpclient:sendcommand發(fā)送命令ftpclient:senddata發(fā)送數(shù)據(jù)用于上載f

11、tpclient:setcommand ftpclient:setcommandsetcommand分別對應(yīng)單指令和雙指令代碼進行重載,將命令格式化并儲存在cmdbuffer中。成員變量:ftpclient:buffer 數(shù)據(jù)緩沖ftpclient:cmdbuffer 應(yīng)答信息緩沖ftpclient:command 命令字符串緩沖ftpclient:ipaddressip地址緩沖 ftpclient:listbuffer 列表信息緩沖ftpclient:port 控制端口信息ftpclient:portfordata數(shù)據(jù)端口信息ftpclient:serveraddr 用于建立控制套接字參數(shù),

12、系統(tǒng)庫參數(shù)ftpclient:serveraddrdata用于建立數(shù)據(jù)套接字參數(shù),系統(tǒng)庫參數(shù)ftpclient:socketcontrol 控制連接套接字ftpclient:socketdata數(shù)據(jù)連接套接字 ftpclient:wsd系統(tǒng)庫參數(shù),代表wsadata。3主程序流程圖:start輸入服務(wù)器ip,port連接服務(wù)器end輸入用戶名密碼身份驗證輸入命令判斷命令執(zhí)行對應(yīng)模塊完成命令listcwddeleretrstormkdrmdquit從這次課設(shè)中我學(xué)到了什么:l 整體的學(xué)習(xí)ftp掌握ftp的工作原理,與協(xié)議工作時的詳細步驟l 建立了以c+為基礎(chǔ)的網(wǎng)絡(luò)編程底層模型,學(xué)會了使用sock

13、et編程并發(fā)送信息l 深入的體會了一次字符串的編輯修改編程發(fā)現(xiàn)其實完全掌握字符串的操作,是很復(fù)雜的一件事l 采用了面向?qū)ο蟮乃枷雭砭幊绦?,加強了對知識的理解。l 全程使用指針、數(shù)組、結(jié)構(gòu)體等底層數(shù)據(jù)操縱方法,雖然錯誤層出不窮,但加深了對指針的理解,并且深感一句箴言的意義:“看你c用得好不好,就是看你指針用得好不好”。l 使用了標(biāo)準(zhǔn)的代碼書寫規(guī)范,變量命名采用駱駝命名法,書寫規(guī)范采取標(biāo)準(zhǔn)c+書寫規(guī)范l 學(xué)習(xí)編寫注釋,了解到注釋的重要作用,可惜寫的還不是很全:p。l 加強了代碼重用性,此段程序我編過兩次,第一次編寫結(jié)束后發(fā)現(xiàn)許多代碼重用性非常高,例如指令內(nèi)容格式化,接收并顯示應(yīng)答信息返回應(yīng)答碼,數(shù)

14、據(jù)連接的建立,第二次編寫時盡量提高了代碼重用性,但做的還是不夠好。l 對于返回值的處理趨向于使用int而不使用void,通過int返回1,0代表成功或不成功。l 防止內(nèi)存泄漏的問題,程序中的num*無法刪除,是我對內(nèi)存泄漏的重要有了更深的理解。l 解決了當(dāng)下載信息大于緩沖區(qū)時應(yīng)當(dāng)怎么做,l 查明了為何通過2下載的文件中的0a,變成了0d0a.在老師的幫助下:)。l 了解了不同操作系統(tǒng)在網(wǎng)絡(luò)中傳輸互聯(lián)的困難。l 學(xué)會了文件讀寫,并能區(qū)分文件讀寫時不同參數(shù)的不同意義l 最重要的事,是我學(xué)習(xí)如何去自學(xué),鑒于老師給的資料并不完整,訪遍baidu,google,csdn,蘭森林,

15、等知名網(wǎng)站查找答案,解決問題,我覺得這是一次寶貴的機會。l 以上的問題,每解決一項,都要花費我好幾個小時的時間,有的問題甚至3天都沒能解決,有的問題可能我還沒能發(fā)現(xiàn),但我覺得其實快樂就在這里,每當(dāng)解決一個困擾了好幾天的問題的時候,那種興奮正是給我堅持下來的動力。最后附上程序代碼ftpclient.h#pragma comment(lib,ws2_32)#include#include#include#include#include#include#include#includeusing namespace std;class ftpclientprivate:wsadata wsd;stri

16、ng ipaddress;int port;char *buffer;char *cmdbuffer;char *listbuffer;char *command;int portfordata;socket socketdata;socket socketcontrol;sockaddr_in serveraddrdata;sockaddr_in serveraddr;/*返回cmdbuffer中有的應(yīng)答碼cmdbuffer必須有返回信息*/int getcode()int code = 100*(cmdbuffer0-0)+10*(cmdbuffer1-0)+(cmdbuffer2-0);

17、return code;/*初始化客戶端,連接服務(wù)器,成功返回1失敗返回0,打印歡迎信息,server返回信息,ip*/int interlizesocket()/建立與socket庫綁定wsastartup(makeword(2,2),&wsd);/創(chuàng)建流式socketsocketcontrol = socket(af_inet,sock_stream,ipproto_tcp);/填充本地socket地址serveraddr.sin_family=af_inet;serveraddr.sin_port=htons(port);serveraddr.sin_addr.s_addr=inet_a

18、ddr(ipaddress.c_str();/向ftp服務(wù)器發(fā)送connect請求connect (socketcontrol, (sockaddr*)&serveraddr, sizeof(serveraddr);/從ftp服務(wù)器獲得connect應(yīng)答if (recv(socketcontrol,cmdbuffer,512,0)coutserver:buffer = new char4096;memset (buffer,null,4096);this-cmdbuffer = new char512;memset (cmdbuffer,null,512);this-listbuffer =

19、new char4096;memset (listbuffer,null,4096);this-command = new char512;memset (command,null,512);ipaddress = ip;port = p;coutip:ip:portendl;if(interlizesocket()=1)coutconnect server successful!endl;ftpclient()delete buffer;delete cmdbuffer;delete listbuffer;delete command;colsesocket(socketcontrol);/

20、*privatepart:固定部分如user pass 等userpart:用戶輸入部分如anonymous direct等標(biāo)準(zhǔn)格式一般為如:user anonymousrn或如pasvrn*/int setcommand(char* privatepart,char* userpart)memset (command,null,strlen(command);memcpy (command,privatepart,strlen(privatepart);memcpy (command+strlen(privatepart),userpart,strlen(userpart);memcpy (

21、command+strlen(privatepart)+strlen(userpart),rn,2);return 1;int setcommand(char* privatepart)memset(command,null,strlen(command);memcpy(command,privatepart,strlen(privatepart);memcpy (command+strlen(privatepart),rn,2);return 1;/*發(fā)送command中的命令command中必須有格式化好的命令*/int sendcommand()coutcommandendl;send(

22、socketcontrol,command,strlen(command),0);memset(command,null,strlen(command);return 1;/*從socketcontrol接收信息讀入cmdbuffer成功返回代碼,失敗返回600.*/int receivecommand()memset(cmdbuffer,null,strlen(cmdbuffer);if(recv(socketcontrol,cmdbuffer,512,0)coutserver:cmdbuffer;int temp = getcode();return temp;return 600;/*s

23、ocketdata初始化,取pasv的返回信息,轉(zhuǎn)化為int建立socket,socketdata信息儲存在buffer或listbuffer中,用于數(shù)據(jù)的傳輸。條件:cmdbuffer中必須儲存有pasv返回信息*/int getport()/*端口號分析相關(guān),通過num數(shù)組讀取3位端口號,通過定位,轉(zhuǎn)換2部分轉(zhuǎn)換為int型端口號。公式x.x.x.x.aaa.bbb:端口號:aaa*512+bbb(網(wǎng)上查得)或?qū)aabbb轉(zhuǎn)換為十進制相加(原為十六進制)*/char* num = new char3;int flaga = 2;int flagb = 0;int temp;int j =

24、0;int i;int test;for(int i = 0;i0)if (cmdbufferi=0&cmdbufferi=0;j-)numj=null;if (flaga = 1)temp = test *256;i+;j+;else if(flaga = 0)temp += test;portfordata = temp;coutdataport:portfordataendl;return 1;/*socket創(chuàng)建相關(guān)*/int interlizedatasocket()/創(chuàng)建流式socketsocketdata = socket(af_inet,sock_stream,ipproto_

25、tcp);/填充本地socket地址serveraddrdata.sin_family=af_inet;serveraddrdata.sin_port=htons(portfordata);serveraddrdata.sin_addr.s_addr=inet_addr(ipaddress.c_str();/向ftp服務(wù)器發(fā)送connect請求connect (socketdata, (sockaddr*)&serveraddrdata, sizeof(serveraddrdata);return 1;/*接收list列表,返回應(yīng)答碼*/int receivelist()memset(list

26、buffer,null,4096);int r = recv(socketdata,listbuffer,4096,0);coutlistbufferr=0;temp-)if (cmdbuffertemp = ()break;for(temp;temp=cmdlenght;temp+)if (cmdbuffertemp=0)filelenght = filelenght * 10 + (cmdbuffertemp-0);while(1)ofstream outputfile(filename,ios:out|ios:app);memset(buffer,null,4096);int r = r

27、ecv(socketdata,buffer,4096,0);outputfile.write(buffer,r);if (r 0) coutrecv errorendl;outputfile.close();closesocket(socketdata);return 0;if (r = 0) break;closesocket(socketdata);outputfile.close();return 1;/*發(fā)送數(shù)據(jù)從filename中讀取數(shù)據(jù)*/int senddata(char* filename)memset(buffer,null,4096);ifstream inputfile(

28、filename,ios:in|ios:app);inputfile.read(buffer,sizeof(buffer);coutbufferendl;send(socketdata,buffer,sizeof(buffer),0);inputfile.close();closesocket(socketdata);return 1;ftpclient.cpp#pragma comment(lib,ws2_32)#include#include#include#include#include#include#includeftpclient.husing namespace std;#def

29、ine menu welcome to the ftp server,please input the command and enter!such as: list,cwd,retr,stor,dele,rmd,mkdint main()char* direct = new char256;memset(direct,null,256);direct1 = /;int returnnum;char ip15;int port;char test;char *username = new char50;memset(username,null,50);memcpy(username,anony

30、mous,strlen(anonymous);char pwd50;char temp512;char command4;char parameter256;coutip;couttest;if(test=y|test=y)couttemp;port = (temp0 - 0)*10+(temp1 - 0);memset(temp,null,2);else if (test=n|test=n)port = 21;else couterrorendl;/*用戶登錄模塊*/ftpclient* client = new ftpclient(ip,port);couttest;if(test=y|t

31、est=y)coutusername;else if (test=n|test=n)coutusername:anonymousendl;else couterror check input!setcommand(user ,username);coutusernamesendcommand();returnnum = client-receivecommand();if(returnnum = 331)coutpwd;client-setcommand(pass ,pwd);client-sendcommand();returnnum = client-receivecommand();if

32、(returnnum = 230)while(1)coutmenuendl;cout;cincommand;if(strcmp(command,list)=0|strcmp(command,list)=0)/*連接控制,傳輸控制,命令傳輸(需使用socketdata連接的命令,如:list)*/client-setcommand(pasv);client-sendcommand();client-receivecommand();client-getport();client-setcommand(type ,a);client-sendcommand();client-receivecomm

33、and();client-interlizedatasocket();client-setcommand(list ,direct);coutdirectsendcommand();client-receivecommand();client-receivelist();client-receivecommand();else if(strcmp(command,cwd)=0|strcmp(command,cwd)=0)memset(direct,null,512);coutplase input the direct of your will(compelity direct):direct

34、;if(memcmp(direct,/,1)!=0)memset(temp,null,512);memcpy(temp,/,strlen(/);memcpy(temp+strlen(/),direct,strlen(direct);memcpy(direct,temp,strlen(temp);client-setcommand(cwd ,direct);client-sendcommand();client-receivecommand();else if(strcmp(command,retr)=0|strcmp(command,retr)=0)char* filename = new c

35、har512;memset(filename,null,512);/*下載模塊*/client-setcommand(pasv);client-sendcommand();client-receivecommand();client-getport();client-setcommand(type ,i);client-sendcommand();client-receivecommand();client-interlizedatasocket();coutfilename;memset(temp,null,512);memcpy(temp,direct,strlen(direct);mem

36、cpy(temp+strlen(direct),/,1);memcpy(temp+strlen(direct)+strlen(/),filename,strlen(filename);client-setcommand(retr ,temp);client-sendcommand();client-receivecommand();client-receivedata(filename);client-receivecommand();delete filename;else if(strcmp(command,stor)=0|strcmp(command,stor)=0)char* file

37、name = new char512;memset(filename,null,512);/* 上載模塊*/client-setcommand(pasv);client-sendcommand();client-receivecommand();client-getport();client-setcommand(type ,i);client-sendcommand();client-receivecommand();client-interlizedatasocket();coutfilename;client-setcommand(stor ,filename);client-sendcommand();client-receivecommand();client-senddata(filename);client-receivecommand();delete filename;else if(strcmp(command,dele)=0|strcmp(command,dele)=0)char* filename = new char512;memset(filename,null,strlen(filename);coutfilename;client-setcommand(dele ,filename);client-sendcommand();client-

溫馨提示

  • 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)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論