計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)FTP文件傳輸
《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)FTP文件傳輸》由會(huì)員分享,可在線閱讀,更多相關(guān)《計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)FTP文件傳輸(19頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。
1、18 沈陽理工大學(xué)課程設(shè)計(jì)專用紙 目 錄 1 課程設(shè)計(jì)的目的和意義 1 1.1設(shè)計(jì)目的 1 1.2設(shè)計(jì)意義 1 2 課程設(shè)計(jì)的內(nèi)容和要求 1 2.1設(shè)計(jì)的內(nèi)容 1 2.2設(shè)計(jì)要求 1 3 課程設(shè)計(jì)的相關(guān)技術(shù) 2 3.1實(shí)現(xiàn)軟件 2 3.2 TCP/IP協(xié)議技術(shù) 2 3.3 TCP/IP協(xié)議與Winsock網(wǎng)絡(luò)編程接口 2 3.4 Winsock API的使用 2 4 課程設(shè)計(jì)過程 3 4.1設(shè)計(jì)思路 3 4.2設(shè)計(jì)方案 3 4.3系統(tǒng)的基本功能 3 4.4客戶端的主要工作流程 4 4.5主要功能模塊如下: 5 4.4程序?qū)崿F(xiàn)部分如下: 10 4.5 程
2、序運(yùn)行結(jié)果截圖 15 5 課程設(shè)計(jì)小結(jié) 18 參考書目 18 1 課程設(shè)計(jì)的目的和意義 1.1設(shè)計(jì)目的 文件傳送是各種計(jì)算機(jī)網(wǎng)絡(luò)都實(shí)現(xiàn)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議按照客戶/服務(wù)器的模式進(jìn)行工作,提供交互式的訪問,是INTERNET使用最廣泛的協(xié)議之一。本程序設(shè)計(jì)主要學(xué)會(huì)學(xué)會(huì)利用已有網(wǎng)絡(luò)環(huán)境設(shè)計(jì)并實(shí)現(xiàn)簡單應(yīng)用層協(xié)議,掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計(jì)方法和實(shí)現(xiàn)技巧,理解處于相同網(wǎng)絡(luò)環(huán)境下的兩個(gè)不相同的程序如何實(shí)現(xiàn)數(shù)據(jù)上傳和下載,進(jìn)一步理解服務(wù)器和客戶端的工作原理及通信方法,在數(shù)據(jù)交互中掌握TCP/IP的體系結(jié)構(gòu),體會(huì)TCP的運(yùn)輸連接管理的三
3、個(gè)階段:建立連接、數(shù)據(jù)傳送、釋放連接。 1.2設(shè)計(jì)意義 文件傳輸協(xié)議是基于TCP\IP協(xié)議的一種標(biāo)準(zhǔn)機(jī)制下的應(yīng)用層協(xié)議,負(fù)責(zé)將文件從一臺(tái)計(jì)算機(jī)傳輸?shù)搅硪慌_(tái)計(jì)算機(jī)上,并保證其傳輸?shù)目煽啃浴R獙?shí)現(xiàn)與兩臺(tái)計(jì)算機(jī)所處的位置,聯(lián)系的方式以使用的操作系統(tǒng)無關(guān),F(xiàn)TP的實(shí)現(xiàn)需要解決一下的問題:兩個(gè)系統(tǒng)可能使用不同的文件名字約定,二個(gè)系統(tǒng)可能用不同的方表示文本和數(shù)據(jù),二個(gè)系統(tǒng)可能有不同的目錄結(jié)構(gòu)。解決以上問題從而可以在各種不同網(wǎng)絡(luò)之間進(jìn)行文件傳輸。 2 課程設(shè)計(jì)的內(nèi)容和要求 2.1設(shè)計(jì)的內(nèi)容 利用計(jì)算機(jī)具備Windows環(huán)境中套接字socket 的編程接口功能,可為用戶提供全網(wǎng)范圍的進(jìn)程通信功能。學(xué)
4、會(huì)利用已有網(wǎng)絡(luò)環(huán)境設(shè)計(jì)并實(shí)現(xiàn)簡單應(yīng)用層協(xié)議,掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計(jì)方法和實(shí)現(xiàn)技巧。用C++語言實(shí)現(xiàn)一個(gè)在相同網(wǎng)絡(luò)環(huán)境下的兩個(gè)不相同的程序如何實(shí)現(xiàn)數(shù)據(jù)上傳和下載(實(shí)現(xiàn)不同計(jì)算機(jī)之間的文件傳送)。 2.2設(shè)計(jì)要求 (1)將本地計(jì)算機(jī)上的一個(gè)或多個(gè)文件傳送到遠(yuǎn)程計(jì)算機(jī)上(上傳),或從遠(yuǎn)程計(jì)算機(jī)上獲取一個(gè)或多個(gè)文件(下載)。傳送文件實(shí)質(zhì)上是將文件進(jìn)行復(fù)制,然后上傳到遠(yuǎn)程計(jì) 算機(jī)上,或者是下載到本地計(jì)算機(jī)上,對源文件不產(chǎn)生影響。 (2)能夠傳送多種類型,多種結(jié)構(gòu),多種格式的文件。(文本文件,二進(jìn)制文件,圖像文件,聲音文件,數(shù)據(jù)壓縮文件)。此外,還可以選擇文件的格式控制以
5、及文件傳送的模式等。用戶可以根據(jù)通信雙方所用的系統(tǒng)及要傳送的文件確定在文件傳輸時(shí)選擇哪一種文件結(jié)構(gòu)。 (3)提供對本地計(jì)算機(jī)和遠(yuǎn)程計(jì)算機(jī)的目錄操作功能。 3 課程設(shè)計(jì)的相關(guān)技術(shù) 3.1實(shí)現(xiàn)軟件 操作系統(tǒng):windows7(windows NT 以上版本皆可) 編程環(huán)境:VC++6.0 編程語言:C++ 測試環(huán)境:MS-DOS 3.2 TCP/IP協(xié)議技術(shù) 在TCP/IP協(xié)議族中,有兩個(gè)互不相同的傳輸協(xié)議:TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。TCP為兩臺(tái)主機(jī)提供高可靠性的數(shù)據(jù)通信。它所做的工作包括把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,確認(rèn)接收到的分
6、組,設(shè)置發(fā)送最后確認(rèn)分組的超時(shí)時(shí)鐘等。由于運(yùn)輸層提供了高可靠性的端到端的通信,因此應(yīng)用層可以忽略所有這些細(xì)節(jié)。而另一方面,UDP則為應(yīng)用層提供一種非常簡單的服務(wù)。它只是把稱作數(shù)據(jù)報(bào)的分組從一臺(tái)主機(jī)發(fā)送到另一臺(tái)主機(jī),但并不保證該數(shù)據(jù)報(bào)能到達(dá)另一端。任何必需的可靠性必須由應(yīng)用層來提供。 3.3 TCP/IP協(xié)議與Winsock網(wǎng)絡(luò)編程接口 Winsock規(guī)范不是一種網(wǎng)絡(luò)協(xié)議,而是一套開放的、支持多種協(xié)議的Windows寫的網(wǎng)絡(luò)編程接口。Winsock可以訪問很多種網(wǎng)絡(luò)協(xié)議,可以把它當(dāng)作一種協(xié)議的封裝?,F(xiàn)在的Winsock已經(jīng)基本上實(shí)現(xiàn)了與協(xié)議無關(guān),可以使用Winsock來調(diào)用協(xié)議的功能 3.
7、4 Winsock API的使用 下面給出了使用Winsock進(jìn)行編程時(shí)涉及的主要函數(shù): WSAStartup函數(shù)、WSACleanup函數(shù)、socket函數(shù)、closesocket函數(shù)、send函數(shù)、recv函數(shù)、bind函數(shù)、listen函數(shù)、accept函數(shù)、connect函數(shù) 4 課程設(shè)計(jì)過程 4.1設(shè)計(jì)思路 使用Socket進(jìn)行Client/Server程序設(shè)計(jì)的一般連接過程是這樣的:Server端Listen(監(jiān)聽)某個(gè)端口是否有連接請求,Client端向Server端發(fā)出Coonnect(連接)請求,Server端向Client端發(fā)回Accept(接受)信息,一個(gè)
8、連接就建立起來了。Server端和Client端都可以通過send,put,dir等方法與對方通信. 1. 客戶端指定要索取服務(wù)器端的哪個(gè)文件夾的內(nèi)容,即在客戶端將服務(wù)器端某個(gè)文件夾的路徑發(fā)送給服務(wù)器端。 2.服務(wù)器端解析這個(gè)字符串,遍歷整個(gè)文件夾,將文件夾中的文件逐個(gè)傳回到客戶端。 3.客戶端逐個(gè)接收服務(wù)器端傳來的文件,安放到指定的目錄下。 4.2設(shè)計(jì)方案 1.服務(wù)器端調(diào)用socket的accept()方法,等待客戶端聯(lián)接。 2.客戶端發(fā)送需要從服務(wù)端獲得的文件夾路徑給服務(wù)器端。 3.服務(wù)器端根據(jù)客戶端發(fā)來的路徑遍歷整個(gè)路徑下的文件及文件夾,并將需要傳送到文件記錄全路徑記錄到一
9、個(gè)String類型的數(shù)組中,并將文件的個(gè)數(shù)發(fā)送給客戶端。 4.客戶端接收服務(wù)器端發(fā)來的文件個(gè)數(shù),并向服務(wù)器端發(fā)送關(guān)閉聯(lián)接請求,并關(guān)閉客戶端連接。 5.服務(wù)器端收取關(guān)閉連接請求,將socket關(guān)閉,進(jìn)入傳輸文件循環(huán)中。 6.服務(wù)器端調(diào)用socket的accept()方法,等待客戶端聯(lián)接。 7.客戶端根據(jù)剛才取得的要傳輸?shù)奈募?shù),進(jìn)行循環(huán)獲取文件,記得每次取完文件要關(guān)閉socket連接,這樣就不會(huì)將多個(gè)文件寫入到同一個(gè)文件中。 4.3系統(tǒng)的基本功能 1.get:取遠(yuǎn)方的一個(gè)文件 2.put:傳給遠(yuǎn)方一個(gè)文件 3.pwd:顯示遠(yuǎn)主當(dāng)前目錄 4.dir:列出遠(yuǎn)方當(dāng)前目錄 5.cd
10、:改變遠(yuǎn)方當(dāng)前目錄 6.? :顯示你提供的命令 7.quit :退出返回 4.4客戶端的主要工作流程 否 開始 輸入連接的主機(jī)號(hào) dir cd ? pwd get put quit 選擇 顯示總菜單 列出遠(yuǎn)方當(dāng)前目錄 顯示遠(yuǎn)方當(dāng)前目錄 改變遠(yuǎn)方當(dāng)前目錄 取遠(yuǎn)方的一個(gè)文件 傳給遠(yuǎn)方一個(gè)文件 顯示結(jié)果 繼續(xù) 是 結(jié)束 圖4-1客戶端的主要工作流程 4.5主要功能模塊如下: (1)幫助顯示客戶端主操作菜單 void help() { cout<<" 歡迎進(jìn)入迷你
11、FTP幫助菜單 "< 12、........上傳(發(fā)送)文件* "< 13、 "< 14、ndl
<<" * * * * * * * * * * * * * * * * * * * * * "< 15、sponse error!\n");
exit(1);
}
if(nRead==0)//數(shù)據(jù)讀取結(jié)束
break;
//顯示數(shù)據(jù)
rbuff[nRead]=\0;
printf("%s",rbuff);
}
}
int SendFile(SOCKET datatcps,FILE* file)//發(fā)送文件,處理put命令
{
printf(" sending file data..");
for(;;)
//從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端
{
int r=fread(sbuff,1,1024,file);//fr 16、ead函數(shù)從file文件讀取1個(gè)1024長度的數(shù)據(jù)到sbuff,返//回成功讀取的元素個(gè)數(shù)
if(send(datatcps,sbuff,r,0)==SOCKET_ERROR)
{
printf("lost the connection to client!\n");
closesocket(datatcps);
return 0;
}
if(r<1024)//文件傳送結(jié)束
break;
}
closesocket(datatcps);
printf("done\n");
return 1;
}
DWORD Sta 17、rtSock()//啟動(dòng)winsock
{WSADATA WSAData;
char a[20];
memset(a,0,20);
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//加載winsock版本
{printf("sock init fail!\n");
return (-1);
}
if(strncmp(InputIP,a,20)==0){
printf("請輸入連接的主機(jī)IP:");
scanf("%s",&InputIP);}
//設(shè)置地址結(jié)構(gòu)
ServerAddr.sin_family=AF_INET;//AF_IN 18、ET表示使用IP地址族
ServerAddr.sin_addr.s_addr=inet_addr(InputIP);//指定服務(wù)器IP
ServerAddr.sin_port=htons(RECV_PORT);//設(shè)置端口號(hào)
return(1);
}
//創(chuàng)建套接字
DWORD CreateSocket()
{
sockclient=socket(AF_INET,SOCK_STREAM,0);//當(dāng)socket函數(shù)成功調(diào)用時(shí)返回一個(gè)新的SOCKET(Socket Descriptor)
if(sockclient==SOCKET_ERROR)
{printf("s 19、ockclient create fail! \n");
WSACleanup();
return(-1);
}
return(1);
}
DWORD CallServer() //發(fā)送連接請求
{
CreateSocket();
if (connect(sockclient,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//connect函數(shù)創(chuàng)建與指定外部端口的//連接
{
printf("Connect fail \n");
memset(InputIP,0 20、,20);
return(-1);
}
return(1);
}
DWORD TCPSend(char data[])//發(fā)送命令
{
int length;
length=send(sockclient,data,strlen(data),0);//send函數(shù)通過sockclient接口發(fā)送data里面的//數(shù)據(jù),發(fā)送成功返回發(fā)送的字節(jié)數(shù)
if(length<=0)
{
printf("send data error ! \n");
closesocket(sockclient);
WSACleanup();
return(- 21、1);
}
return(1);
}
(3)主函數(shù)代碼
int main()
{char messge1[10];//定義輸入要處理的文件名
char messge2[20];//定義輸入要處理的文件名
char order[30];//輸入的命令
order[0]=\0;
char buff[80];//用以存儲(chǔ)經(jīng)過字串格式化的order
FILE *fd;//File協(xié)議主要用于訪問本地計(jì)算機(jī)中的文件,fd指針指向要訪問的目標(biāo)文件
FILE *fd2;
int count;
int sin_size=sizeof(ServerAddr); 22、
StartSock();
if(CallServer()==-1) return main();//發(fā)送連接請求失敗,返回主函數(shù)
printf("\n請輸入命令(輸入?或help進(jìn)入幫助菜單):\n");
memset(buff,0,80);//清空數(shù)組
memset(messge2,0,20);
memset(order,0,30);
memset(messge1,0,10);
memset(rbuff,0,1024);
memset(sbuff,0,1024);
scanf("%s",&messge1);
if(strncmp 23、(messge1,"get",3)==0)
scanf("%s",&messge2);
if(strncmp(messge1,"put",3)==0)
scanf("%s",&messge2);
if(strncmp(messge1,"cd",2)==0)
scanf("%s",&messge2);
strcat(order,messge1);//把messge1加在order的末尾
strcat(order," ");//命令中間的空格
strcat(order,messge2);//把messge2加在order的末尾 24、
sprintf(buff,order);//把調(diào)整格式的order存入buff
//help和?
if(strncmp(messge1,"help",4)==0){
help();}
if(strncmp(messge1,"?",1)==0){
help();}
if(strncmp(messge1,"quit",4)==0){
printf(" 歡迎再次進(jìn)入迷你FTP,謝謝使用!\n");
closesocket(sockclient);
WSACleanup( 25、);
return 0; }
TCPSend(buff);//發(fā)送buff里面的數(shù)據(jù)
recv(sockclient,rbuff,1024,0);
printf(rbuff);
if(strncmp(rbuff,"get",3)==0)
{
fd=fopen(messge2,"wb");//使用二進(jìn)制方式,打開文件,wb只寫打開或新建一//個(gè)二進(jìn)制文件;只允許寫數(shù)據(jù)。
if(fd==NULL)
{
printf("open file %s for we 26、ite failed!\n",messge2);
return 0;
}
while((count=recv(sockclient,rbuff,1024,0))>0){
fwrite(rbuff,sizeof(rbuff),count,fd);}//把count個(gè)數(shù)據(jù)長度為size0f()的數(shù)據(jù)從//rbuff輸入到fd指向的目標(biāo)文件
fclose(fd);//關(guān)閉文件
}//get
if(strncmp(rbuff,"put",3)==0)
{
strcpy(filename,rb 27、uff+9);
fd2=fopen(filename,"rb");//rb讀寫打開一個(gè)二進(jìn)制文件,只允許讀寫數(shù)據(jù)。
if(fd2){
if(!SendFile(sockclient,fd2)){
printf("send failed!");
return 0;}
fclose(fd2);}//關(guān)閉文件
else//打開文件失敗
{
strcpy(sbuff,"cant open file!\n");
if(send(sockclient,sbuff,1024,0))
return 0; }
}//p 28、ut
if(strncmp(rbuff,"dir",3)==0)
{
printf("\n");
list(sockclient);//列出接受到的列表內(nèi)容
}//dir
if(strncmp(rbuff,"pwd",3)==0)
{
list(sockclient);//列出接受到的內(nèi)容--絕對路徑
}
if(strncmp(rbuff,"cd",2)==0){
}//cd
closesocket(sockclient);//關(guān)閉連接
WSACleanup();//釋放Winsock
return main();
}//main
4 29、.4程序?qū)崿F(xiàn)部分如下:
客戶端:
#include "Winsock.h"
#include "windows.h"
#include "stdio.h"
#include "time.h"
#include 30、1024];//接收緩沖區(qū)
char sbuff[1024];//發(fā)送緩沖區(qū)
char InputIP[20];//存儲(chǔ)輸入的服務(wù)器IP
//處理help命令
void help()
{
cout<<" 歡迎進(jìn)入迷你FTP幫助菜單 "< 31、..下載(接受)文件* "< 32、徑* "< 33、<<" *6.?或者h(yuǎn)elp................進(jìn)入幫助菜單* "< 34、{
nRead=recv(sockclient,rbuff,1024,0);//recv函數(shù)通過sockclient套接口接受數(shù)據(jù)存入rbuff緩//沖區(qū),返回接受到的字節(jié)數(shù)
if(nRead==SOCKET_ERROR)
{
printf("read response error!\n");
exit(1);
}
if(nRead==0)//數(shù)據(jù)讀取結(jié)束
break;
//顯示數(shù)據(jù)
rbuff[nRead]=\0;
printf("%s",rbuff);
}
}
int SendFile(SOCKET dat 35、atcps,FILE* file)//發(fā)送文件,處理put命令
{
printf(" sending file data..");
for(;;)
//從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端
{
int r=fread(sbuff,1,1024,file);//fread函數(shù)從file文件讀取1個(gè)1024長度的數(shù)據(jù)到sbuff,返//回成功讀取的元素個(gè)數(shù)
if(send(datatcps,sbuff,r,0)==SOCKET_ERROR)
{
printf("lost the connection to client!\n");
closesock 36、et(datatcps);
return 0;
}
if(r<1024)//文件傳送結(jié)束
break;
}
closesocket(datatcps);
printf("done\n");
return 1;
}
DWORD StartSock()//啟動(dòng)winsock
{WSADATA WSAData;
char a[20];
memset(a,0,20);
if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)//加載winsock版本
{printf("sock init fail!\n");
r 37、eturn (-1);
}
if(strncmp(InputIP,a,20)==0){
printf("請輸入連接的主機(jī)IP:");
scanf("%s",&InputIP);}
//設(shè)置地址結(jié)構(gòu)
ServerAddr.sin_family=AF_INET;//AF_INET表示使用IP地址族
ServerAddr.sin_addr.s_addr=inet_addr(InputIP);//指定服務(wù)器IP
ServerAddr.sin_port=htons(RECV_PORT);//設(shè)置端口號(hào)
return(1);
}
//創(chuàng)建套接字
DWORD CreateSock 38、et()
{
sockclient=socket(AF_INET,SOCK_STREAM,0);//當(dāng)socket函數(shù)成功調(diào)用時(shí)返回一個(gè)新的SOCKET(Socket Descriptor)
if(sockclient==SOCKET_ERROR)
{printf("sockclient create fail! \n");
WSACleanup();
return(-1);
}
return(1);
}
DWORD CallServer() //發(fā)送連接請求
{
CreateSocket();
if (connect(sockclient,(s 39、truct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)//connect函數(shù)創(chuàng)建與指定外部端口的//連接
{
printf("Connect fail \n");
memset(InputIP,0,20);
return(-1);
}
return(1);
}
DWORD TCPSend(char data[])//發(fā)送命令
{
int length;
length=send(sockclient,data,strlen(data),0);//send函數(shù)通過sockclie 40、nt接口發(fā)送data里面的//數(shù)據(jù),發(fā)送成功返回發(fā)送的字節(jié)數(shù)
if(length<=0)
{
printf("send data error ! \n");
closesocket(sockclient);
WSACleanup();
return(-1);
}
return(1);
}
int main()
{char messge1[10];//定義輸入要處理的文件名
char messge2[20];//定義輸入要處理的文件名
char order[30];//輸入的命令
order[0]=\0;
char buff[ 41、80];//用以存儲(chǔ)經(jīng)過字串格式化的order
FILE *fd;//File協(xié)議主要用于訪問本地計(jì)算機(jī)中的文件,fd指針指向要訪問的目標(biāo)文件
FILE *fd2;
int count;
int sin_size=sizeof(ServerAddr);
StartSock();
if(CallServer()==-1) return main();//發(fā)送連接請求失敗,返回主函數(shù)
printf("\n請輸入命令(輸入?或help進(jìn)入幫助菜單):\n");
memset(buff,0,80);//清空數(shù)組
memset(messge2,0,20);
42、 memset(order,0,30);
memset(messge1,0,10);
memset(rbuff,0,1024);
memset(sbuff,0,1024);
scanf("%s",&messge1);
if(strncmp(messge1,"get",3)==0)
scanf("%s",&messge2);
if(strncmp(messge1,"put",3)==0)
scanf("%s",&messge2);
if(strncmp(messge1,"cd",2)==0)
scanf("%s",&mess 43、ge2);
strcat(order,messge1);//把messge1加在order的末尾
strcat(order," ");//命令中間的空格
strcat(order,messge2);//把messge2加在order的末尾
sprintf(buff,order);//把調(diào)整格式的order存入buff
//help和?
if(strncmp(messge1,"help",4)==0){
help();}
if(strncmp(messge1,"?",1)==0){
help();}
if(strncmp(messge 44、1,"quit",4)==0){
printf(" 歡迎再次進(jìn)入迷你FTP,謝謝使用!\n");
closesocket(sockclient);
WSACleanup();
return 0; }
TCPSend(buff);//發(fā)送buff里面的數(shù)據(jù)
recv(sockclient,rbuff,1024,0);
printf(rbuff);
if(strncmp(rbuff,"get",3)==0)
{
fd=fope 45、n(messge2,"wb");//使用二進(jìn)制方式,打開文件,wb只寫打開或新建一//個(gè)二進(jìn)制文件;只允許寫數(shù)據(jù)。
if(fd==NULL)
{
printf("open file %s for weite failed!\n",messge2);
return 0;
}
while((count=recv(sockclient,rbuff,1024,0))>0){
fwrite(rbuff,sizeof(rbuff),count,fd);}//把count個(gè)數(shù)據(jù) 46、長度為size0f()的數(shù)據(jù)從//rbuff輸入到fd指向的目標(biāo)文件
fclose(fd);//關(guān)閉文件
}//get
if(strncmp(rbuff,"put",3)==0)
{
strcpy(filename,rbuff+9);
fd2=fopen(filename,"rb");//rb讀寫打開一個(gè)二進(jìn)制文件,只允許讀寫數(shù)據(jù)。
if(fd2){
if(!SendFile(sockclient,fd2)){
printf("send failed!");
return 0;}
fclose(fd2); 47、}//關(guān)閉文件
else//打開文件失敗
{
strcpy(sbuff,"cant open file!\n");
if(send(sockclient,sbuff,1024,0))
return 0; }
}//put
if(strncmp(rbuff,"dir",3)==0)
{
printf("\n");
list(sockclient);//列出接受到的列表內(nèi)容
}//dir
if(strncmp(rbuff,"pwd",3)==0)
{
list(sockclient);//列出接受到的內(nèi)容--絕對路徑 48、
}
if(strncmp(rbuff,"cd",2)==0){
}//cd
closesocket(sockclient);//關(guān)閉連接
WSACleanup();//釋放Winsock
return main();
}//main
4.5 程序運(yùn)行結(jié)果截圖
(1) 輸入IP 192.168.1.100與服務(wù)器連接進(jìn)入主界面
圖4-2 與服務(wù)器連接進(jìn)入主界面顯示圖
(2)dir命令操作顯示圖
圖4-3 dir命令操作顯示圖
(3)pwd命令操作顯示圖
圖4-4 pwd命令操作顯示圖
(4)cd命令操作顯示圖
圖4- 49、5 cd命令操作顯示圖
(5)get命令操作顯示圖
圖4-6 get命令操作顯示圖
(6) put命令操作圖
圖4-7 put命令操作圖
5 課程設(shè)計(jì)小結(jié)
通過這次設(shè)計(jì),我不但加深了對SOCKET的原始套接字RAW編程的理解,同時(shí)也對文件傳輸有了進(jìn)一步的認(rèn)識(shí)。本次課程設(shè)計(jì)較好地實(shí)現(xiàn)了要求做到的功能,但同時(shí)也遇到了不少的困難和挑戰(zhàn)。這次設(shè)計(jì)的主要難點(diǎn),在于數(shù)據(jù)包的發(fā)送接收,TTL的計(jì)算,以及超時(shí)的判斷。通過這次的課程設(shè)計(jì)讓我明白了很多,要多讀程序,掌握基本的函數(shù),編程要用的話,可以得心應(yīng)手。
通過這次課程設(shè)計(jì),我了解到自己網(wǎng)絡(luò)通訊技術(shù)方面還有很多不足,在完成實(shí)驗(yàn)的過程中同學(xué)給了我很大的幫助和鼓勵(lì),使我能夠很好的完成這次實(shí)驗(yàn)。
參考書目
[1]吳功宜﹑胡曉英﹑張仁﹑何云﹑王寧.計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì).機(jī)械工業(yè)出版社,2007年12月
[2]張堯?qū)W﹑郭國強(qiáng)﹑王曉春﹑趙艷標(biāo).計(jì)算機(jī)網(wǎng)絡(luò)與Internet教材(第二版).清華大學(xué)出版社,2006年11月
18
- 溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 藥事管理與法規(guī)楊世民第2版第一章
- 初中語法-形容詞和副詞
- 《公民的基本權(quán)利和義務(wù)》人教部編版道德與法治課件
- 五年級(jí)上冊音樂課件-豐收的節(jié)日(2)|人音版(簡譜)最新
- 企業(yè)家商業(yè)計(jì)劃培訓(xùn)教程75275
- 員工保密意識(shí)及技能教育培訓(xùn)課件
- [精選]CAINA肖爾布拉克營銷戰(zhàn)略規(guī)劃(PPT 174頁)5799
- 教育專題:18___跨越百年的美麗
- 北魏孝文帝的改革措施
- 教育專題:兒童防拐教案1
- 數(shù)據(jù)隔離級(jí)別
- 最新2018清新簡約工作匯報(bào)模板【ppt精美模板】
- 電子工藝第5章(精品)
- [精選]中化公司銷售培訓(xùn)77824
- (連云港專版)中考?xì)v史復(fù)習(xí) 第2單元 中國近代史 第9課時(shí) 抗日戰(zhàn)爭和人民解放戰(zhàn)爭的勝利課件 北師大版