版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p> 計算機網絡課程設計報告</p><p> 題目:文件傳輸協議的設計與實現</p><p><b> 目錄</b></p><p> 1.課程設計目的和要求</p><p><b> 2.背景知識</b></p><p><b> 3.
2、課程設計分析</b></p><p><b> 4.程序清單</b></p><p><b> 5.運行結果</b></p><p><b> 6.總結</b></p><p><b> 課程設計目的和要求</b></p>
3、<p> 文件傳輸是各種計算機的網絡的基本功能,文件傳送協議是一種最基本的應用層協議。它是按照客戶或服務器模式進行的工作,提供交式的訪問。是INTERNRT使用最廣泛的協議之一。以及深入了解計算機網絡是建立在TCP/IP網絡體系結構上。</p><p> 用 socket 編程接口編寫倆個程序,分別為客戶程序和服務器程序</p><p> 掌握TCP/IP 網絡應用程序基
4、本的設計方法;</p><p> 用socket 編程接口編寫兩個程序,分別為客戶程序(client.c)和服務器程序(server.c);</p><p> 撰寫課程設計說明書。裝訂后的課程設計說明書不少于10面(含封面、任務書、目錄、正文、參考文獻、成績評定表、封底)。</p><p><b> 背景知識</b></p>
5、<p> 第一個FTP的RFC由A.K.Bhushan 在1971年提出,同時由MIT與Harvard實驗實現,RFC 172提供了主機間文件傳輸的一個用戶級協議。長期發(fā)展過程由于底層協議從NCP改變?yōu)門CP,RFC765定義了采用TCP的FCP.</p><p> FTP協議在今天已經發(fā)展成熟,應用也越來越廣很多開發(fā)的比較成熟的FTP客戶端軟件已經得到了廣泛的應用.</p><
6、;p><b> 課程設計分析</b></p><p> Server端 Client端</p><p> 創(chuàng)建ServerSocket對象,在某端口提供監(jiān)聽服務Client端 </p><p> 等待來自Client端的服務請求 </p&
7、gt;<p> 接受Client端的請求,用返回的 創(chuàng)建Socket對象,向Server </p><p> Socket建立連接 的監(jiān)聽端口請求 </p><p> 通過向Socket中讀寫數據來
8、通過向新的Socket中讀寫數</p><p> 與Client端通信 據來與Server端通信</p><p> 關閉Socket,結束與Server端的通信 關閉Socket,結束與當前</p><p> Client的通信,等待其他請求</p>
9、<p> 關閉ServerSocket對象,結束監(jiān)聽服務</p><p><b> 4.程序清單:</b></p><p><b> 服務器源代碼:</b></p><p> #include <Winsock2.h></p><p> #include <s
10、tdio.h></p><p> #include <iostream></p><p> using namespace std;</p><p> #pragma comment(lib, "wsock32.lib")</p><p> #define PORT 4523</p>
11、;<p> char buf_send[1024];</p><p> char buf_rec[1024];</p><p> SOCKET sockSrv;</p><p> //socket初始化</p><p> DWORD CreateSocket()</p><p><b>
12、; {</b></p><p> WSADATA WSAData;//WSADATA結構被用來保存函數WSAStartup返回的Windows Sockets初始化信息</p><p> if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//WSAStartup完成winsock的初始化</p><p>
13、{printf("socket initialize failed!\n");</p><p> return (-1);</p><p><b> }</b></p><p> sockSrv=socket(AF_INET,SOCK_STREAM,0);//定義為面向連接的,返回值送給sockSrv</p>
14、;<p> if(sockSrv==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("socket create failed ! \n");</p><p> WSACleanup();//中止Windows Sockets DLL的使用</p&
15、gt;<p> return(-1);</p><p><b> }</b></p><p> SOCKADDR_IN addrSrv;//TCP/IP使用SOCKADDR_IN 定義地址</p><p> addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);//計算機IP地址&l
16、t;/p><p> addrSrv.sin_port=htons(PORT);//協議端口號</p><p> addrSrv.sin_family=AF_INET;//地址所屬協議簇</p><p><b> //綁定端口</b></p><p> if(bind(sockSrv,(struct sockaddr
17、FAR *)&addrSrv,sizeof(addrSrv))==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("Bind Error");</p><p> return(-1);</p><p><b> }</b
18、></p><p> return (1);</p><p><b> }</b></p><p> int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)//用于回復給客戶端</p><p><b> {</b></p&
19、gt;<p> char filerecord[MAX_PATH+32];</p><p> FILETIME ft;</p><p> FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);//將一個FILETIME結構轉換成本地時間 </p><p> SYSTEMTIM
20、E lastwtime;//系統時間</p><p> FileTimeToSystemTime(&ft,&lastwtime);//根據一個FILETIME結構的內容,裝載一個SYSTEMTIME結構 </p><p> char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"<
21、DIR>":" ";</p><p> sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20s\n", </p><p> lastwtime.wYear,</p><p> lastwtime.wMonth,</p>&
22、lt;p> lastwtime.wDay,</p><p> lastwtime.wHour,</p><p> lastwtime.wMinute,</p><p><b> dir,</b></p><p> pfd->nFileSizeLow,</p><p> pf
23、d->cFileName);</p><p> if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR)//發(fā)送回復失敗</p><p><b> {</b></p><p> printf("Error occurs when sending fil
24、e list!\n");</p><p><b> return 0;</b></p><p><b> }</b></p><p><b> return 1;</b></p><p><b> }</b></p><
25、;p> //發(fā)送主機文件目錄</p><p> int SendFileList(SOCKET datatcps)</p><p><b> {</b></p><p> HANDLE hff;</p><p> WIN32_FIND_DATA fd; //獲取和更改文件屬性</p><
26、;p> hff=FindFirstFile("*",&fd);//搜索文件</p><p> if(hff==INVALID_HANDLE_VALUE)//搜索無效返回值</p><p><b> {</b></p><p> const char *errstr="can't lis
27、t files!\n";</p><p> cout<<"list file error!"<<endl;</p><p> if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR)</p><p><b> {</b></
28、p><p> cout<<"error occurs when sending file list!"<<endl;</p><p><b> }</b></p><p> closesocket(datatcps);</p><p><b> return 0;
29、</b></p><p><b> }</b></p><p> BOOL fMoreFiles=TRUE;//BOOL型,返回值為大于0的整數時為TRUE,返回值為0時候,為FALSE,返回值為-1時為ERROR。</p><p> while(fMoreFiles)</p><p><b>
30、; {</b></p><p> //發(fā)送此項文件信息</p><p> if(!SendFileRecord(datatcps,&fd))//發(fā)送失敗</p><p><b> {</b></p><p> closesocket(datatcps);</p><p&g
31、t;<b> return 0;</b></p><p><b> }</b></p><p><b> //搜索下一個文件</b></p><p> fMoreFiles=FindNextFile(hff,&fd);</p><p><b> }&
32、lt;/b></p><p> closesocket(datatcps);</p><p><b> return 1;</b></p><p><b> }</b></p><p><b> //發(fā)送數據</b></p><p> i
33、nt SendFile(SOCKET datatcps,FILE* file)//發(fā)送文件</p><p><b> {</b></p><p> printf("sending file data..");</p><p><b> for(;;)</b></p><p>
34、; //從文件中循環(huán)讀取數據并發(fā)送客戶端</p><p><b> {</b></p><p> int r=fread(buf_send,1,1024,file);</p><p> if(send(datatcps,buf_send,r,0)==SOCKET_ERROR)</p><p><b>
35、 {</b></p><p> printf("lost the connection to client!\n");</p><p> closesocket(datatcps);</p><p><b> return 0;</b></p><p><b> }<
36、;/b></p><p> if(r<1024)//文件傳送結束</p><p><b> break;</b></p><p><b> }</b></p><p> closesocket(datatcps);</p><p> printf(&qu
37、ot;done\n");</p><p><b> return 1;</b></p><p><b> }</b></p><p> DWORD ProcessCmd()</p><p><b> {</b></p><p> if
38、(listen(sockSrv,5)<0)//監(jiān)聽信號</p><p><b> {</b></p><p> cout<<"Listen error!"<<endl;</p><p> return(-1);</p><p><b> }</b&
39、gt;</p><p> cout<<"Listening for the request……"<<endl;</p><p> SOCKADDR_IN addrclient;//定義用于返回客戶機端地址的結構</p><p> int len=(sizeof(SOCKADDR_IN));</p>&l
40、t;p><b> while(1)</b></p><p><b> {</b></p><p> SOCKET sockconn=accept(sockSrv,(SOCKADDR*)&addrclient,&len);//接受請求,產生新的套接字</p><p> if(sockconn==
41、INVALID_SOCKET)</p><p><b> continue;</b></p><p> else cout<<"connecting from client"<<endl;</p><p> while(true)</p><p><b> {
42、</b></p><p> char filename[20];</p><p> memset(buf_rec,0,1024);</p><p> memset(buf_send,0,1024);</p><p> if(recv(sockconn,buf_rec,1024,0)<=0)</p>&l
43、t;p><b> {</b></p><p><b> break;</b></p><p><b> } </b></p><p> cout<<endl<<"the command is:"<<buf_rec<<e
44、ndl;</p><p> if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_rec,"get",3)!=0&&strncmp(buf_rec,"put",3)!=0)</p><p> continue;//有一個請求正確執(zhí)行下面語句</p>
45、<p> if(strncmp(buf_rec,"dir",3)==0)</p><p><b> {</b></p><p> strcpy(buf_send,"dir-ing\n");</p><p> send(sockconn,buf_send,1024,0);</p&g
46、t;<p> SendFileList(sockconn);//發(fā)送當前所有文件名</p><p><b> }//dir</b></p><p> if (strncmp(buf_rec,"get",3)==0)</p><p><b> { </b></p>
47、;<p> strcpy(filename,buf_rec+4);</p><p> cout<<filename;</p><p> FILE *file; </p><p> //處理下載文件請求</p><p> file=fopen(filename,"rb");//打開下載的文
48、件</p><p><b> if(file)</b></p><p><b> { </b></p><p> sprintf(buf_send,"get file %s\n",filename);</p><p> if(!send(sockconn,buf_send
49、,1024,0))</p><p> {fclose(file);</p><p> return 0;}</p><p><b> else</b></p><p> {//創(chuàng)建額外數據連接傳送數據</p><p> if(!SendFile(sockconn,file))</p
50、><p><b> return 0;</b></p><p> fclose(file);}</p><p><b> }//file</b></p><p> else//打開文件失敗</p><p><b> {</b></p>
51、<p> strcpy(buf_send,"can't open file!\n");</p><p> if(send(sockconn,buf_send,1024,0))</p><p><b> return 0;</b></p><p><b> }</b><
52、/p><p> }//get 處理客戶端的下載請求</p><p> if(strncmp(buf_rec,"put",3)==0)</p><p><b> {</b></p><p><b> FILE *fd;</b></p><p> in
53、t count;</p><p> strcpy(filename,buf_rec+4); </p><p> fd=fopen(filename,"wb");</p><p> if(fd==NULL)</p><p><b> {</b></p><p> pri
54、ntf("open file %s for weite failed!\n",filename);</p><p><b> continue;</b></p><p><b> }</b></p><p> sprintf(buf_send,"put file %s",fil
55、ename);</p><p> if(!send(sockconn,buf_send,1024,0))</p><p> {fclose(fd);</p><p><b> return 0;</b></p><p><b> }</b></p><p> wh
56、ile((count=recv(sockconn,buf_rec,1024,0))>0)</p><p> fwrite(buf_rec,sizeof(char),count,fd);</p><p> fclose(fd);</p><p><b> continue;</b></p><p> }//p
57、ut 處理客戶端的上傳請求</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> int main()</p><p><b> {</b>&l
58、t;/p><p> CreateSocket();</p><p> ProcessCmd();</p><p> return(1);</p><p><b> }</b></p><p> 2. 客戶端程序源代碼:</p><p> #include <W
59、insock2.h></p><p> #include <stdio.h></p><p> #include <iostream></p><p> using namespace std;//使用名稱空間std</p><p> #pragma comment(lib, "wsock3
60、2.lib")//將WinLib.lib庫加入到工程中進行編譯</p><p> #define PORT 4523//定義端口號為4523</p><p> char send_str[1024];</p><p> char rec_str[1024];</p><p> char IP[20];</p>
61、<p> char filename[20];</p><p> SOCKET sockClient;</p><p> SOCKADDR_IN addrServer;//定義表示地址的結構體addrServer,用來表示本地地址</p><p><b> //創(chuàng)建套接字</b></p><p> D
62、WORD CreateSock()</p><p><b> {</b></p><p><b> //本地信息</b></p><p> addrServer.sin_family=AF_INET;//地址所屬協議簇</p><p> //AF表示ADDRESS FAMILY 地址族<
63、;/p><p> // htons的功能:將一個無符號短整型數值轉換為網絡字節(jié)序</p><p> addrServer.sin_port=htons(PORT);//協議端口號</p><p> WSADATA WSAData;//WSADATA結構被用來保存函數WSAStartup返回的Windows Sockets初始化信息</p><p
64、> WORD wVersionRequsdted;</p><p><b> int err;</b></p><p> wVersionRequsdted=MAKEWORD(2,2);</p><p> err=WSAStartup(wVersionRequsdted,&WSAData);</p><
65、p> if(err!=0){</p><p> printf("sock init fail!\n");</p><p> return(-1);</p><p><b> }</b></p><p> cout<<"please input the IP of
66、host:";</p><p> scanf("%s",&IP);</p><p> addrServer.sin_addr.s_addr=inet_addr(IP);//計算機IP地址</p><p> return(1);</p><p><b> }</b></p
67、><p> DWORD ConnectServer() //連接服務器</p><p><b> {</b></p><p> sockClient=socket(AF_INET,SOCK_STREAM,0);//創(chuàng)建套接字,SOCK_STREAM為面向連接型</p><p> if(sockClient==S
68、OCKET_ERROR)</p><p><b> {</b></p><p> printf("sock create fail! \n");</p><p> WSACleanup();//中止Windows Sockets DLL的使用.</p><p> return(-1);<
69、/p><p><b> }</b></p><p> if(connect(sockClient,(struct sockaddr *)&addrServer,sizeof(addrServer))==SOCKET_ERROR)//如果請求建立連接錯誤</p><p><b> {</b></p>
70、<p> printf("Connect fail \n");</p><p> memset(IP,0,20);</p><p> return(-1);</p><p><b> }</b></p><p> return(1);</p><p><
71、;b> }</b></p><p> void help()</p><p><b> {</b></p><p> cout<<"help List:"<<endl;</p><p> cout<<"dir…………………………
72、……directory list "<<endl;</p><p> cout<<"get………………………………download files"<<endl;</p><p> cout<<"put………………………………upload files "<<endl;</p
73、><p> cout<<"quit………………………………exit !"<<endl;</p><p><b> }</b></p><p> //list讀取服務器列表</p><p> void list(SOCKET sock)</p><p>
74、;<b> {</b></p><p> int nRead;</p><p> while(true)</p><p><b> {</b></p><p> nRead=recv(sock,rec_str,1024,0);//從一個套接口接收數據</p><p>
75、; if(nRead==SOCKET_ERROR)</p><p><b> {</b></p><p> cout<<"read response error!"<<endl;</p><p><b> exit(1);</b></p><p>
76、<b> }</b></p><p> if(nRead==0)//數據讀取結束</p><p><b> break;</b></p><p><b> //顯示數據</b></p><p> rec_str[nRead]='\0';</p&g
77、t;<p> printf("%s",rec_str);</p><p><b> }</b></p><p><b> }</b></p><p> int SendFile(SOCKET datatcps,FILE* file)//SOCKET datatcps定義變量數據連接
78、套接字 </p><p><b> {</b></p><p> cout<<"sending file data.."<<endl;</p><p><b> for(;;)</b></p><p><b> {</b>&l
79、t;/p><p> int r=fread(send_str,1,1024,file);//從一個流中讀數據 </p><p> if(send(datatcps,send_str,r,0)==SOCKET_ERROR)</p><p><b> {</b></p><p> printf("lost th
80、e connection to client!\n");</p><p> closesocket(datatcps);</p><p><b> return 0;</b></p><p><b> }</b></p><p> if(r<1024)//文件傳送結束<
81、/p><p><b> break;</b></p><p><b> }</b></p><p> closesocket(datatcps);//關閉接口</p><p> printf("done\n");</p><p> return(1)
82、;</p><p><b> }</b></p><p> int Cprocess()</p><p><b> {</b></p><p> int count;</p><p> char order[10];</p><p> ch
83、ar param[20];</p><p> char command[30];</p><p><b> FILE *fd;</b></p><p> FILE *fd2;</p><p> command[0]='\0';</p><p> CreateSock();
84、</p><p> ConnectServer();</p><p> cout<<"please input order :"<<endl;</p><p> memset(order,0,10);//初始化為0</p><p> memset(param,0,20);//初始化為0<
85、;/p><p> memset(command,0,30);//初始化為0</p><p> memset(rec_str,0,1024);//初始化為0</p><p> memset(send_str,0,1024);//初始化為0</p><p> cin>>order;</p><p> st
86、rcat(command,order);</p><p> if(strncmp(order,"get",3)==0||strncmp(order,"put",3)==0)//輸入請求,有一個輸入要求正確,輸入目標文件名</p><p><b> {</b></p><p> cin>>
87、param;</p><p> strcat(command," ");</p><p> strcat(command,param);</p><p><b> }</b></p><p> cout<<command<<endl;</p><p&
88、gt; strcpy(send_str,command);</p><p> if(send(sockClient,send_str,sizeof(send_str),0)<0)</p><p><b> {</b></p><p> cout<<"send data error!"<<
89、endl;</p><p> closesocket(sockClient);</p><p> WSACleanup();</p><p><b> return 0;</b></p><p><b> }</b></p><p> recv(sockClient
90、,rec_str,1024,0);//接受鏈接數據,放入rec_str</p><p> cout<<rec_str<<endl;</p><p> if(strncmp(command,"quit",4)==0)</p><p><b> {</b></p><p>
91、 closesocket(sockClient);</p><p> WSACleanup();</p><p><b> return 0;</b></p><p><b> }//quit</b></p><p> if(strncmp(rec_str,"dir",3
92、)==0)</p><p><b> {</b></p><p> list(sockClient);</p><p><b> }//dir</b></p><p> if(strncmp(rec_str,"get",3)==0)</p><p>
93、;<b> {</b></p><p> fd=fopen(param,"wb");//使用二進制方式創(chuàng)建并打開名為param的文件</p><p> if(fd==NULL) //打開失敗</p><p><b> {</b></p><p> printf(&q
94、uot;open file %s for weite failed!\n",param);</p><p><b> return 0;</b></p><p><b> }</b></p><p> while((count=recv(sockClient,rec_str,1024,0))>0)//
95、接收文件,放入rec_str</p><p><b> {</b></p><p> fwrite(rec_str,sizeof(char),count,fd);}</p><p> fclose(fd);</p><p><b> }//get</b></p><p&g
96、t; if(strncmp(rec_str,"put",3)==0)</p><p><b> {</b></p><p> strcpy(filename,rec_str+9);//復制需發(fā)送的文件名稱,賦給filename</p><p> fd2=fopen(filename,"rb");&
97、lt;/p><p> if(fd2)//假如讀文件成功</p><p><b> {</b></p><p> if(!SendFile(sockClient,fd2))//假如發(fā)送失敗</p><p><b> { </b></p><p> printf("
98、;send failed!");</p><p><b> return 0;</b></p><p><b> }</b></p><p> fclose(fd2);</p><p><b> }</b></p><p> else
99、//打開文件失敗</p><p><b> {</b></p><p> strcpy(send_str,"can't open file!\n");</p><p> if(send(sockClient,send_str,1024,0))</p><p><b> ret
100、urn 0;</b></p><p><b> }</b></p><p><b> }//put</b></p><p> closesocket(sockClient);</p><p> WSACleanup();</p><p> return
101、 Cprocess();</p><p><b> }</b></p><p> int main()</p><p><b> {</b></p><p><b> help();</b></p><p> Cprocess();</p
102、><p><b> return 0;</b></p><p><b> }</b></p><p><b> 5.程序運行結果</b></p><p><b> 一.正確功能實現</b></p><p> 運行客戶端,輸入服
103、務器正確IP地址,連接成功后,輸入dir查看服務器所在文件夾中的文件</p><p> 用put命令發(fā)送文件p.txt,發(fā)送完畢,查看服務器所在文件夾,發(fā)現p.txt存在</p><p><b> 運行錯誤測試</b></p><p> 1.運行客戶端,輸入錯誤的IP地址。輸入請求后,顯示框直接關閉</p><p>
104、;<b> 總結</b></p><p> 通過本次實驗,我對網絡命令有了一定的概念性認識,并熟悉了基本網絡命令的使用,通過miniFTP Client/Server實驗的實踐,了解了SOCKET編程相關的一些知識以及用法,了解了客戶端和服務器端進行通信的相關算法機制,在建立通信的基礎上,實現了一些簡單的功能。限于自己的能力,對SOCKET編程理解還不夠透徹,對網絡通信也只局限
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- ftp文件傳輸課程設計
- ftp文件傳輸課程設計
- 計算機網絡課程設計--文件傳輸協議的簡單設計與實現
- 基于UDP的可靠文件傳輸協議的設計與實現.pdf
- 衛(wèi)星通信系統文件傳輸協議的設計與實現.pdf
- 串行通信微機原理課程設計--串行通信實現文件傳輸
- 單向廣播網絡可靠文件傳輸協議的設計與實現.pdf
- 文件傳輸與聊天系統設計
- java課程設計---局域網的聊天和文件傳輸
- 計算機網絡課程設計_ftp文件傳輸
- 分布式文件傳輸系統的設計與實現.pdf
- 基于SSL協議的加密文件傳輸系統設計.pdf
- 文件傳輸與聊天系統設計.doc
- 基于NFC技術的文件傳輸應用設計與實現.pdf
- CCSDS文件傳輸協議研究.pdf
- 基于藍牙技術的文件傳輸系統的設計與實現.pdf
- 基于OpenSSL的安全文件傳輸系統設計與實現.pdf
- 集群環(huán)境中文件傳輸調度系統的設計與實現.pdf
- 深空Ka波段的中繼CCSDS文件傳輸協議設計.pdf
- 基于局域網的文件傳輸系統的設計與實現畢業(yè)設計
評論
0/150
提交評論