FTP文件傳輸?shù)脑O(shè)計(jì)與實(shí)現(xiàn)_第1頁(yè)
FTP文件傳輸?shù)脑O(shè)計(jì)與實(shí)現(xiàn)_第2頁(yè)
FTP文件傳輸?shù)脑O(shè)計(jì)與實(shí)現(xiàn)_第3頁(yè)
FTP文件傳輸?shù)脑O(shè)計(jì)與實(shí)現(xiàn)_第4頁(yè)
FTP文件傳輸?shù)脑O(shè)計(jì)與實(shí)現(xiàn)_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余9頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、附件:程序代碼 服務(wù)器源代碼: #include <Winsock2.h> #include <stdio.h> #include <iostream> using namespace std;#pragma comment(lib, "wsock32.lib")#define PORT 4523char buf_send1024;char buf_rec1024;SOCKET sockSrv;/socket 初始化DWORD CreateSocket()WSADATA WSAData;/WSADA琳勾被用來(lái)保存函數(shù) WSAStartup

2、返回的 Windows Sockets初始化信息 if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0)/WSAStartup 完成 winsock 的初始化 printf("socket initialize failed!n");return (-1);sockSrv=socket(AF_INET,SOCK_STREAM,0);/ 定義為面向連接的,返回值送給 sockSrv if(sockSrv=SOCKET_ERROR)printf("socket create failed ! n");WSACleanup(

3、);/ 中止 Windows Sockets DLL 的使用 return(-1);SOCKADDR_IN addrSrv;/TCP/IP 使用 SOCKADDR_I定義地址addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);計(jì)算機(jī) IP 地址addrSrv.sin_port=htons(PORT);/協(xié)議端 口 號(hào)addrSrv.sin_family=AF_INET;/地址所屬協(xié)議簇/綁定端口if(bind(sockSrv,(struct sockaddr FAR *)&addrSrv,sizeof(addrSrv)=SOCKET_ERROR

4、) printf("Bind Error");return(-1);return (1);用于回復(fù)給客戶端int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)/ char filerecordMAX_PATH+32;FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);將一個(gè) FILETIME 結(jié)構(gòu)轉(zhuǎn)換成本地時(shí)間SYSTEMTIME lastwtime;/ 系統(tǒng)時(shí)間FileTimeToSystemTime(&ft,

5、&lastwtime);/根據(jù)一個(gè) FILETIME 結(jié)構(gòu)的內(nèi)容,裝載一個(gè)SYSTEMTIME結(jié)構(gòu)char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?”<DIR>":""sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20sn",lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinut

6、e,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)=SOCKET_ERROR)發(fā)送回復(fù)失敗 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("

7、*",&fd);/搜索文件if(hff=INVALID_HANDLE_VALUE)/ 搜索無(wú)效返回值 const char *errstr="can't list files!n"cout<<"list file error!"<<endl;if(send(datatcps,errstr,strlen(errstr),0)=SOCKET_ERROR) cout<<"error occurs when sending file list!"<<endl;close

8、socket(datatcps);return 0;BOOL fMoreFiles=TRUE;/BOOL型,返回值為大于 0的整數(shù)時(shí)為T(mén)RUE返回值為0時(shí)候,為FALSE, 返回彳!為-1時(shí)為ERRORwhile(fMoreFiles)/發(fā)送此項(xiàng)文件信息if(!SendFileRecord(datatcps,&fd)/發(fā)送失敗closesocket(datatcps);return 0;/搜索下一個(gè)文件fMoreFiles=FindNextFile(hff,&fd);closesocket(datatcps);return 1;/發(fā)送數(shù)據(jù)int SendFile(SOCKET

9、datatcps,FILE* file)/發(fā)送文件printf("sending file data.");for(;)/從文件中循環(huán)讀取數(shù)據(jù)并發(fā)送客戶端int r=fread(buf_send,1,1024,file);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);prin

10、tf("donen");return 1;DWORD ProcessCmd()if(listen(sockSrv,5)<0)監(jiān)聽(tīng)信號(hào)cout<<"Listen error!"<<endl;return(-1);<<endl;cout<<"Listening for the requestSOCKADDR_IN addrclient;/ 定義用于返回客戶機(jī)端地址的結(jié)構(gòu) int len=(sizeof(SOCKADDR_IN);while(1) SOCKET sockconn=accept(so

11、ckSrv,(SOCKADDR*)&addrclient,&len);/接受請(qǐng)求,產(chǎn)生新的套接字 if(sockconn=INVALID_SOCKET) continue; else cout<<"connecting 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

12、<<"the command is:"<<buf_rec<<endl;if(strncmp(buf_rec,"dir",3)!=0&&strncmp(buf_rec,"get",3)!=0&&strncmp(buf_rec,"put",3)!= 0) continue;/有一個(gè)請(qǐng)求正確執(zhí)行下面語(yǔ)句if(strncmp(buf_rec,"dir",3)=0) strcpy(buf_send,"dir-ingn"

13、); send(sockconn,buf_send,1024,0); SendFileList(sockconn);/發(fā)送當(dāng)前所有文件名/dir if (strncmp(buf_rec,"get",3)=0) strcpy(filename,buf_rec+4); cout<<filename; FILE *file;/處理下載文件請(qǐng)求file=fopen(filename,"rb");打開(kāi)下載的文件if(file) sprintf(buf_send,"get file %sn",filename);if(!send(so

14、ckconn,buf_send,1024,0) fclose(file);return 0;else/創(chuàng)建額外數(shù)據(jù)連接傳送數(shù)據(jù)if(!SendFile(sockconn,file)return 0; fclose(file);/fileelse/打開(kāi)文件失敗strcpy(buf_send,"can't open file!n"); if(send(sockconn,buf_send,1024,0)return 0;/get 處理客戶端的下載請(qǐng)求if(strncmp(buf_rec,"put",3)=0)FILE *fd;int count;str

15、cpy(filename,buf_rec+4);fd=fopen(filename,"wb");if(fd=NULL)printf("open file %s for weite failed!n",filename); continue; 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) fwri

16、te(buf_rec,sizeof(char),count,fd);fclose(fd);continue;/put處理客戶端的上傳請(qǐng)求int main()CreateSocket();ProcessCmd();return(1);客戶端程序源代碼:#include <Winsock2.h>#include <stdio.h>#include <iostream>using namespace std;/使用名稱空間 std#pragma comment(lib, "wsock32.lib")/ 將 WinLib.lib庫(kù)加入到工程中進(jìn)行

17、編譯#define PORT 4523 定義端口 號(hào)為 4523char send_str1024;char rec_str1024;char IP20;char filename20;SOCKET sockClient;SOCKADDR_IN addrServer;/定義表示地址的結(jié)構(gòu)體addrServer ,用來(lái)表示本地地址/創(chuàng)建套接字DWORD CreateSock()/本地信息addrServer.sin_family=AF_INET;/地址所屬協(xié)議簇/AF 表示 ADDRESS FAMIL飽址族/ htons 的功能:將一個(gè)無(wú)符號(hào)短整型數(shù)值轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序addrServer.sin

18、_port=htons(PORT);/ 協(xié)議端 口 號(hào)WSADATA WSAData;/WSADATA勾被用來(lái)保存函數(shù) WSAStartup返回的 Windows Sockets初始化信息 WORD wVersionRequsdted;int err;wVersionRequsdted=MAKEWORD(2,2);err=WSAStartup(wVersionRequsdted,&WSAData);if(err!=0)printf("sock init fail!n");return(-1);cout<<"please input the IP

19、 of host :"scanf("%s",&IP);addrServer.sin_addr.s_addr=inet_addr(IP);/計(jì)算機(jī) IP 地址return(1);DWORD ConnectServer() /連接服務(wù)器sockClient=socket(AF_INET,SOCK_STREAM,0);/ if(sockClient=SOCKET_ERROR)創(chuàng)建套接字,SOCK_STREAM面向連接型printf("sock create fail! n");WSACleanup();/ 中止 Windows Sockets

20、 DLL的使用.return(-1);if(connect(sockClient,(structsockaddr*)&addrServer,sizeof(addrServer)=SOCKET_ERROR)/如果請(qǐng)求建立連接錯(cuò)誤printf("Connect fail 'n");memset(IP,0,20);return(-1);return(1);void help()cout<<"help List : "<<endl;cout<<"dirdirectory list "<

21、<endl;cout<<"getcout<<"putcout<<"quit/list讀取服務(wù)器列表download files"<<endl;uplo ad files "<<endl;exit !"<<endl;void list(SOCKET sock)int nRead;從一個(gè)套接口接收數(shù)據(jù)while(true)nRead=recv(sock,rec_str,1024,0); if(nRead=SOCKET_ERROR)cout<<&quo

22、t;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 datatcps,FILE* file)/SOCKET datatcps定義變量數(shù)據(jù)連接套接字 cout<<"sending file data."<<endl;for(;) int r=fread(send_str,1,1024,file);

23、/從一個(gè)流中讀數(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é)束break;closesocket(datatcps);/ 關(guān)閉接口 printf("donen");return(1);int Cprocess() int count;char order10;char param20;char command30;FILE

24、*fd;FILE *fd2;command0='0'CreateSock();ConnectServer();cout<<"please input order :"<<endl;memset(order,0,10);/初始化為 0memset(param,0,20);/ 初始化為 0memset(command,0,30);/ 初始化為 0memset(rec_str,0,1024);/ 初始化為 0memset(send_str,0,1024);/初始化為 0cin>>order;strcat(command,orde

25、r);if(strncmp(order,"get",3)=0|strncmp(order,"put",3)=0)輸入請(qǐng)求,有一個(gè)輸入要求正確,輸入目標(biāo)文件名 cin>>param; strcat(command,""); strcat(command,param); cout<<command<<endl; strcpy(send_str,command); if(send(sockClient,send_str,sizeof(send_str),0)<0) cout<<"

26、;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 0; /quitif(strncmp(rec_str,"dir",

27、3)=0) list(sockClient);/dirif(strncmp(rec_str,"get",3)=0) fd=fopen(param,"wb");/使用二進(jìn)制方式創(chuàng)建并打開(kāi)名為param的文件if(fd=NULL) /打開(kāi)失敗printf("open file %s for weite failed!n",param);return 0;strwhile(count=recv(sockClient,rec_str,1024,0)>0)/接收文件,放入 rec fwrite(rec_str,sizeof(char),c

28、ount,fd);fclose(fd); /getif(strncmp(rec_str,"put",3)=0) strcpy(filename,rec_str+9);復(fù)制需發(fā)送的文件名稱,賦給 filenamefd2=fopen(filename,"rb");if(fd2)/假如讀文件成功if(!SendFile(sockClient,fd2)/假如發(fā)送失敗 printf("send failed!"); return 0; fclose(fd2); else/打開(kāi)文件失敗 strcpy(send_str,"can'

29、t open file!n");if(send(sockClient,send_str,1024,0) return 0; /put closesocket(sockClient); WSACleanup();return Cprocess(); int main() help();Cprocess();return 0;程序運(yùn)行結(jié)果一.正確功能實(shí)現(xiàn)1 .運(yùn)行客戶端,輸入服務(wù)器正確IP地址,連接成功后,輸入dir查看服務(wù)器 所在文件夾中的文件EQ Cs DacnBEnt jr md Se虻ingdEusC桌面、程疔實(shí)現(xiàn)客戶 JJkHcbii.kG he2011-06-16 2011HB6-162eilHM-ig 2011-06-16 2:U11 HMi-16 2011-06-16 2011-96-16A1白打匕電 i力妙S .EXE £.ilk 9 .cbj s,. pc h& Bpdb vc(0.idb ui: 5 tl. pclhO1R>0<DIHA82G222454WJ5& 607232 197G32 135ilbHIP o£ 1»£1 :2 .用put命令發(fā)送文件a.txt ,發(fā)送完畢,查看服務(wù)器所在文件夾,發(fā)現(xiàn)a.txt 存在L-il Sb Ltmufa?

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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)論