版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、實(shí)驗(yàn)一:文件傳輸協(xié)議的設(shè)計(jì)與實(shí)現(xiàn) 目錄1.實(shí)驗(yàn)設(shè)計(jì)目的和要求2.背景知識3.課程設(shè)計(jì)分析4.程序清單5.運(yùn)行結(jié)果6.總結(jié)1. 課程設(shè)計(jì)目的和要求文件傳輸是各種計(jì)算機(jī)的網(wǎng)絡(luò)的基本功能,文件傳送協(xié)議是一種最基本的應(yīng)用層協(xié)議。它是按照客戶或服務(wù)器模式進(jìn)行的工作,提供交式的訪問。是INTERNRT使用最廣泛的協(xié)議之一。以及深入了解計(jì)算機(jī)網(wǎng)絡(luò)是建立在TCP/IP網(wǎng)絡(luò)體系結(jié)構(gòu)上。用 socket 編程接口編寫倆個程序,分別為客戶程序和服務(wù)器程序1 掌握TCP/IP 網(wǎng)絡(luò)應(yīng)用程序基本的設(shè)計(jì)方法;2 用socket 編程接口編寫兩個程序,分別為客戶程序(client.c)和服務(wù)器程序(server.c);3
2、撰寫課程設(shè)計(jì)說明書。裝訂后的課程設(shè)計(jì)說明書不少于10面(含封面、任務(wù)書、目錄、正文、參考文獻(xiàn)、成績評定表、封底)。2. 背景知識第一個FTP的RFC由A.K.Bhushan 在1971年提出,同時由MIT與Harvard實(shí)驗(yàn)實(shí)現(xiàn),RFC 172提供了主機(jī)間文件傳輸?shù)囊粋€用戶級協(xié)議。長期發(fā)展過程由于底層協(xié)議從NCP改變?yōu)門CP,RFC765定義了采用TCP的FCP. FTP協(xié)議在今天已經(jīng)發(fā)展成熟,應(yīng)用也越來越廣很多開發(fā)的比較成熟的FTP客戶端軟件已經(jīng)得到了廣泛的應(yīng)用.3. 課程設(shè)計(jì)分析 Server端 Client端創(chuàng)建ServerSocket對象,在某端口提供監(jiān)聽服務(wù)Client端 等待來自C
3、lient端的服務(wù)請求 接受Client端的請求,用返回的 創(chuàng)建Socket對象,向Server Socket建立連接 的監(jiān)聽端口請求 通過向Socket中讀寫數(shù)據(jù)來 通過向新的Socket中讀寫數(shù)與Client端通信 據(jù)來與Server端通信關(guān)閉Socket,結(jié)束與Server端的通信 關(guān)閉Socket,結(jié)束與當(dāng)前 Client的通信,等待其他請求關(guān)閉ServerSocket對象,結(jié)束監(jiān)聽服務(wù)4.程序清單:1. 服務(wù)器源代碼:#include <Winsock2.h>#include <stdio.h>#include <iostream>using na
4、mespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send1024;char buf_rec1024;SOCKET sockSrv;/socket初始化DWORD CreateSocket()WSADATA WSAData;/WSADATA結(jié)構(gòu)被用來保存函數(shù)WSAStartup返回的Windows Sockets初始化信息if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/WSAStartup完成winsock的初始化printf(&quo
5、t;socket initialize failed!n");return (-1);sockSrv=socket(AF_INET,SOCK_STREAM,0);/定義為面向連接的,返回值送給sockSrvif(sockSrv=SOCKET_ERROR)printf("socket create failed ! n");WSACleanup();/中止Windows Sockets DLL的使用return(-1);SOCKADDR_IN addrSrv;/TCP/IP使用SOCKADDR_IN 定義地址addrSrv.sin_addr.S_un.S_addr=
6、htonl(INADDR_ANY);/計(jì)算機(jī)IP地址addrSrv.sin_port=htons(PORT);/協(xié)議端口號addrSrv.sin_family=AF_INET;/地址所屬協(xié)議簇/綁定端口if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv)=SOCKET_ERROR)printf("Bind Error");return(-1);return (1);int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)/用于回復(fù)給客戶端
7、char filerecordMAX_PATH+32;FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);/將一個FILETIME結(jié)構(gòu)轉(zhuǎn)換成本地時間 SYSTEMTIME lastwtime;/系統(tǒng)時間FileTimeToSystemTime(&ft,&lastwtime);/根據(jù)一個FILETIME結(jié)構(gòu)的內(nèi)容,裝載一個SYSTEMTIME結(jié)構(gòu) char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"
8、<DIR>":" "sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20sn", lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)=SOCKET_ERROR)/發(fā)送回復(fù)失敗
9、printf("Error occurs when sending file list!n");return 0;return 1;/發(fā)送主機(jī)文件目錄int SendFileList(SOCKET datatcps)HANDLE hff;WIN32_FIND_DATA fd; /獲取和更改文件屬性hff=FindFirstFile("*",&fd);/搜索文件if(hff=INVALID_HANDLE_VALUE)/搜索無效返回值const char *errstr="can't list files!n"cout&l
10、t;<"list file error!"<<endl;if(send(datatcps,errstr,strlen(errstr),0)=SOCKET_ERROR)cout<<"error occurs when sending file list!"<<endl;closesocket(datatcps);return 0;BOOL fMoreFiles=TRUE;/BOOL型,返回值為大于0的整數(shù)時為TRUE,返回值為0時候,為FALSE,返回值為-1時為ERROR。while(fMoreFiles)/發(fā)送
11、此項(xiàng)文件信息if(!SendFileRecord(datatcps,&fd)/發(fā)送失敗closesocket(datatcps);return 0;/搜索下一個文件fMoreFiles=FindNextFile(hff,&fd);closesocket(datatcps);return 1;/發(fā)送數(shù)據(jù)int SendFile(SOCKET datatcps,FILE* file)/發(fā)送文件printf("sending file data.");for(;)/從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端int r=fread(buf_send,1,1024,file);
12、if(send(datatcps,buf_send,r,0)=SOCKET_ERROR)printf("lost the connection to client!n");closesocket(datatcps);return 0;if(r<1024)/文件傳送結(jié)束break;closesocket(datatcps);printf("donen");return 1;DWORD ProcessCmd()if(listen(sockSrv,5)<0)/監(jiān)聽信號cout<<"Listen error!"<
13、<endl;return(-1);cout<<"Listening for the request"<<endl;SOCKADDR_IN addrclient;/定義用于返回客戶機(jī)端地址的結(jié)構(gòu)int len=(sizeof(SOCKADDR_IN);while(1)SOCKET sockconn=accept(sockSrv,(SOCKADDR*)&addrclient,&len);/接受請求,產(chǎn)生新的套接字if(sockconn=INVALID_SOCKET)continue;else cout<<"co
14、nnecting from client"<<endl;while(true)char filename20;memset(buf_rec,0,1024);memset(buf_send,0,1024);if(recv(sockconn,buf_rec,1024,0)<=0)break; cout<<endl<<"the command is:"<<buf_rec<<endl;if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_
15、rec,"get",3)!=0&&strncmp(buf_rec,"put",3)!=0)continue;/有一個請求正確執(zhí)行下面語句if(strncmp(buf_rec,"dir",3)=0)strcpy(buf_send,"dir-ingn");send(sockconn,buf_send,1024,0);SendFileList(sockconn);/發(fā)送當(dāng)前所有文件名/dirif (strncmp(buf_rec,"get",3)=0) strcpy(filename,
16、buf_rec+4);cout<<filename;FILE *file; /處理下載文件請求file=fopen(filename,"rb");/打開下載的文件if(file) sprintf(buf_send,"get file %sn",filename);if(!send(sockconn,buf_send,1024,0)fclose(file);return 0;else/創(chuàng)建額外數(shù)據(jù)連接傳送數(shù)據(jù)if(!SendFile(sockconn,file)return 0;fclose(file);/fileelse/打開文件失敗strc
17、py(buf_send,"can't open file!n");if(send(sockconn,buf_send,1024,0)return 0;/get 處理客戶端的下載請求if(strncmp(buf_rec,"put",3)=0)FILE *fd;int count;strcpy(filename,buf_rec+4); fd=fopen(filename,"wb");if(fd=NULL)printf("open file %s for weite failed!n",filename);con
18、tinue;sprintf(buf_send,"put file %s",filename);if(!send(sockconn,buf_send,1024,0)fclose(fd);return 0;while(count=recv(sockconn,buf_rec,1024,0)>0)fwrite(buf_rec,sizeof(char),count,fd);fclose(fd);continue;/put 處理客戶端的上傳請求int main()CreateSocket();ProcessCmd();return(1);2. 客戶端程序源代碼:#include
19、<Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;/使用名稱空間std#pragma comment(lib, "wsock32.lib")/將WinLib.lib庫加入到工程中進(jìn)行編譯#define PORT 4523/定義端口號為4523char send_str1024;char rec_str1024;char IP20;char filename20;SOCKET sockClient;SOCKADDR_IN addrServer;/定義表示
20、地址的結(jié)構(gòu)體addrServer,用來表示本地地址/創(chuàng)建套接字DWORD CreateSock()/本地信息addrServer.sin_family=AF_INET;/地址所屬協(xié)議簇/AF表示ADDRESS FAMILY 地址族/ htons的功能:將一個無符號短整型數(shù)值轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序addrServer.sin_port=htons(PORT);/協(xié)議端口號WSADATA WSAData;/WSADATA結(jié)構(gòu)被用來保存函數(shù)WSAStartup返回的Windows Sockets初始化信息WORD wVersionRequsdted;int err;wVersionRequsdted=MA
21、KEWORD(2,2);err=WSAStartup(wVersionRequsdted,&WSAData);if(err!=0)printf("sock init fail!n");return(-1);cout<<"please input the IP of host:"scanf("%s",&IP);addrServer.sin_addr.s_addr=inet_addr(IP);/計(jì)算機(jī)IP地址return(1);DWORD ConnectServer() /連接服務(wù)器sockClient=soc
22、ket(AF_INET,SOCK_STREAM,0);/創(chuàng)建套接字,SOCK_STREAM為面向連接型if(sockClient=SOCKET_ERROR)printf("sock create fail! n");WSACleanup();/中止Windows Sockets DLL的使用.return(-1);if(connect(sockClient,(struct sockaddr *)&addrServer,sizeof(addrServer)=SOCKET_ERROR)/如果請求建立連接錯誤printf("Connect fail n"
23、;);memset(IP,0,20);return(-1);return(1);void help()cout<<"help List:"<<endl;cout<<"dirdirectory list "<<endl;cout<<"getdownload files"<<endl;cout<<"putupload files "<<endl;cout<<"quitexit !"<&l
24、t;endl; /list讀取服務(wù)器列表void list(SOCKET sock)int nRead;while(true)nRead=recv(sock,rec_str,1024,0);/從一個套接口接收數(shù)據(jù)if(nRead=SOCKET_ERROR)cout<<"read response error!"<<endl;exit(1);if(nRead=0)/數(shù)據(jù)讀取結(jié)束break;/顯示數(shù)據(jù)rec_strnRead='0'printf("%s",rec_str);int SendFile(SOCKET dat
25、atcps,FILE* file)/SOCKET datatcps定義變量數(shù)據(jù)連接套接字 cout<<"sending file data."<<endl;for(;)int r=fread(send_str,1,1024,file);/從一個流中讀數(shù)據(jù) if(send(datatcps,send_str,r,0)=SOCKET_ERROR)printf("lost the connection to client!n");closesocket(datatcps);return 0;if(r<1024)/文件傳送結(jié)束bre
26、ak;closesocket(datatcps);/關(guān)閉接口printf("donen");return(1);int Cprocess()int count;char order10;char param20;char command30;FILE *fd;FILE *fd2;command0='0'CreateSock();ConnectServer();cout<<"please input order :"<<endl;memset(order,0,10);/初始化為0memset(param,0,20);
27、/初始化為0memset(command,0,30);/初始化為0memset(rec_str,0,1024);/初始化為0memset(send_str,0,1024);/初始化為0cin>>order;strcat(command,order);if(strncmp(order,"get",3)=0|strncmp(order,"put",3)=0)/輸入請求,有一個輸入要求正確,輸入目標(biāo)文件名cin>>param;strcat(command," ");strcat(command,param);cout
28、<<command<<endl;strcpy(send_str,command);if(send(sockClient,send_str,sizeof(send_str),0)<0)cout<<"send data error!"<<endl;closesocket(sockClient);WSACleanup();return 0;recv(sockClient,rec_str,1024,0);/接受鏈接數(shù)據(jù),放入rec_strcout<<rec_str<<endl;if(strncmp(command,"quit",4)=0)closesocket(sockClient);WSACleanup();return
溫馨提示
- 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版施工隊(duì)中途退場預(yù)防措施及違約責(zé)任協(xié)議3篇
- 2025年湖南省懷化靖州苗族侗族自治縣自來水公司招聘筆試參考題庫附帶答案詳解
- 2025年銷售員聘用協(xié)議書含客戶關(guān)系維護(hù)服務(wù)2篇
- 2025年度新型智能公寓租賃合同范本4篇
- 2025版安防產(chǎn)品銷售代理居間服務(wù)合同范本
- 2025年度個人租車保險(xiǎn)及救援服務(wù)合作協(xié)議4篇
- 2025年全球及中國半導(dǎo)體光刻模擬器行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025-2030全球心包穿刺套件行業(yè)調(diào)研及趨勢分析報(bào)告
- 2025年全球及中國光熱液壓系統(tǒng)行業(yè)頭部企業(yè)市場占有率及排名調(diào)研報(bào)告
- 2025年鋼構(gòu)工程裝配式建筑合同樣本2篇
- 公務(wù)攝影拍攝技巧分享
- 倉儲中心退貨管理制度
- 豐田鋒蘭達(dá)說明書
- 白宮-人工智能行業(yè):美國人工智能權(quán)利法案藍(lán)圖(英譯中)
- 典范英語8-15Here comes trouble原文翻譯
- 六安市葉集化工園區(qū)污水處理廠及配套管網(wǎng)一期工程環(huán)境影響報(bào)告書
- 運(yùn)動技能學(xué)習(xí)與控制課件第一章運(yùn)動技能學(xué)習(xí)與控制概述
- 工程設(shè)計(jì)費(fèi)取費(fèi)標(biāo)準(zhǔn)
- 清華大學(xué)考生自述
- 人機(jī)工程學(xué)與眼鏡
- 中層后備干部培訓(xùn)心得體會范本
評論
0/150
提交評論