当前位置:文档之家› FTP客户端的设计与实现模板

FTP客户端的设计与实现模板

附件1:课程设计(学年设计、学年论文)任务书模版FTP客户端的设计与实现课程设计任务书附件2:设计说明书(或论文)模版一、选题背景(标题:四号仿宋加粗,顶格,行间距:24磅,上下间距:段前0.5行,段后0.5行)(内容:用小四号仿宋,首行空两格)文件传送是各种计算机网络都实现的基本功能,文件传送协议是一种最基本的应用层协议按照客户/服务器的模式进行工作,提供交互式的访问,是Internet使用最广泛的协议之一。

本实验的目的是,学会利用已有网络环境设计并实现简单应用层协议,掌握TCP/IP 网络应用程序基本的设计方法和实现技巧。

应达到的要求是根据账号和密码登录指定的FTP服务器,可以查看服务器内容列表,下载选定的文件,重命名或删除指定的文件/文件夹,也可以把本地文件上传到服务器上。

二、方案设计(或概要设计)流程图如图[1]图[2]所示:图[1].服务器监听图[2].客户端由图[1]的服务器端建立一个监听,然后根据图[2]启动客户端,实现一系列要求。

三、详细设计我们的计算机网络实验环境建立在TCP/IP 网络体系结构之上。

各计算机除了安装TCP/IP 软件外,还安装了TCP/IP 开发系统。

实验室各计算机具备Windows 环境中套接字socket 的编程接口功能,可为用户提供全网范围的进程通信功能。

本实验要求学生利用这些功能,设计和实现一个简单的文件传送协议。

1、服务器端的主要代码由于要实现多线程,必须把功能独立出来,且包装成线程,首先建一个监听线程,主要负责接入客户,并启动另一个客户线程。

具体程序如下:(其中包括一些说明)//包含需要用到的头文件#include "Winsock.h"#include "windows.h"#include "stdio.h"#include "time.h"#include <iostream.h>#define RECV_PORT 2000#define SEND_PORT 3000#pragma comment(lib, "wsock32.lib")//处理help命令void help(){cout<<"*********************COMMANDShelp***********************"<<endl<<"****命令*******************作用*****************"<<endl<<" X或者'help'...........显示你提供的所有命令 "<<endl<<" dir...................显示远方当前目录的文件 "<<endl<<" cd....................改变远方当前目录和路径 "<<endl<<" 进入下级目录: 'cd 路径名' "<<endl<<" 进入上级目录: 'cd ..' "<<endl<<" get...................下载(接受)文件 "<<endl<<" get的用法: 'get 文件名' "<<endl <<" put..................上传(发送)文件 "<<endl<<" put的用法:'put 文件名' "<<endl<<" quit...................退出 "<<endl<<"*****************************************************"<<endl;}//处理dir命令void list(SOCKET sockfd){int nRead;while(true){nRead=recv(sock,rbuff,1024,0);if(nRead==SOCKET_ERROR){printf("read response error!\n");exit(1);}if(nRead==0)//数据读取结束break;//显示数据rbuff[nRead]='\0';printf("%s",rbuff);}}int SendFile(SOCKET datatcps,FILE* file){printf("sending file data..");for(;;)//从文件中循环读取数据并发送客户端{int r=fread(sbuff,1,1024,file);if(send(datatcps,sbuff,r,0)==SOCKET_ERROR) {printf("lost thr connection to client!\n"); closesocket(datatcps);return 0;}if(r<1024)//文件传送结束break;}closesocket(datatcps);printf("done\n");return 1;}//初始化scoketDWORD StartSock(){WSADATA WSAData;char a[20];memset(a,0,20);if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0) {printf("sock init fail!\n");return (-1);}if(strncmp(IIP,a,20)==0){printf("请输入连接的主机号:");scanf("%s",&IIP);}ServerAddr.sin_family=AF_INET; ServerAddr.sin_addr.s_addr=inet_addr(IIP); ServerAddr.sin_port=htons(RECV_PORT); return(1);}//发送连接请求DWORD CallServer() {CreateSocket();if (connect(sock,(struct sockaddr *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR){printf("Connect fail \n");memset(IIP,0,20);return(-1);}return(1);}//发送命令DWORD TCPSend(char data[]) {int length;length=send(sock,data,strlen(data),0);if(length<=0){printf("send data error ! \n");closesocket(sock);WSACleanup();return(-1);}return(1);}2、客户端的主要代码先连接服务器,接着发送命令1(给我文件信息),其中包括文件长度,名字等,然后根据长度决定分几个线程下载,并初使化下载进程,接着发送命令2(可以给我传文件了),并记录文件进程。

最后,收尾。

DWORD StartSock(){WSADATA WSAData;if(WSAStartup(MAKEWORD(2,2),&WSAData)!=0){printf("sock init fail!\n");return (-1);}return(1);}DWORD CreateSocket(){sock=socket(AF_INET,SOCK_STREAM,0);/* 建立套接字 */if(sock==SOCKET_ERROR){printf("sock create fail ! \n");WSACleanup();return(-1);}ServerAddr.sin_family=AF_INET;ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY); /* 任意网络接口 */ ServerAddr.sin_port=htons(RECV_PORT);if(bind(sock,(struct sockaddr FAR *)&ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR){printf("bind is the error");return(-1);}return (1);}//发送文件int SendFileRecord(SOCKET datatcps,WIN32_FIND_DATA *pfd)//used to send response to client{char filerecord[MAX_PATH+32];FILETIME ft;FileTimeToLocalFileTime(&pfd->ftLastWriteTime,&ft);SYSTEMTIME lastwtime;FileTimeToSystemTime(&ft,&lastwtime);char *dir=pfd->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY?"<DIR>":" "; sprintf(filerecord,"%04d-%02d-%02d %02d:%02d %5s %10d %-20s\n", lastwtime.wYear,lastwtime.wMonth,lastwtime.wDay,lastwtime.wHour,lastwtime.wMinute,dir,pfd->nFileSizeLow,pfd->cFileName);if(send(datatcps,filerecord,strlen(filerecord),0)==SOCKET_ERROR){printf("Error occurs when sending file list!\n");return 0;}return 1;}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";printf("list file error!\n");if(send(datatcps,errstr,strlen(errstr),0)==SOCKET_ERROR) {printf("error occurs when senging file list!\n");}closesocket(datatcps);return 0;}BOOL fMoreFiles=TRUE;while(fMoreFiles){//发送此项文件信息if(!SendFileRecord(datatcps,&fd)){closesocket(datatcps);return 0;}//搜索下一个文件fMoreFiles=FindNextFile(hff,&fd);}closesocket(datatcps);return 1;}int SendFile(SOCKET datatcps,FILE* file){printf("sending file data..");for(;;)//从文件中循环读取数据并发送客户端{int r=fread(sbuff,1,1024,file);if(send(datatcps,sbuff,r,0)==SOCKET_ERROR) {printf("lost the connection to client!\n"); closesocket(datatcps);return 0;}if(r<1024)//文件传送结束break;}closesocket(datatcps);printf("done\n");return 1;}//连接DWORD ConnectProcess(){Addrlen=sizeof(sockaddr_in);if(listen(sock,5)<0) //连接数?{printf("Listen error");return(-1);}printf("Listening...\n");for(;;){sock1=accept(sock,(struct sockaddr FAR *)&ClientAddr,&Addrlen);for(;;){memset(rbuff,0,1024);memset(sbuff,0,1024);if(recv(sock1,rbuff,1024,0)<=0){break;}printf("\n");printf("获取并执行的命令为:");printf(rbuff);if (strncmp(rbuff,"get",3)==0){strcpy(filename,rbuff+4);printf(filename);FILE *file;//处理下载文件请求file=fopen(filename,"rb");//打开下载的文件if(file){sprintf(sbuff,"get file %s\n",filename);if(!send(sock1,sbuff,1024,0)){fclose(file);return 0;}else{//创建额外数据连接传送数据if(!SendFile(sock1,file))return 0;fclose(file);}}//fileelse//打开文件失败{strcpy(sbuff,"can't open file!\n");if(send(sock1,sbuff,1024,0))return 0;} //lost}//getif(strncmp(rbuff,"put",3)==0){FILE *fd;int count;strcpy(filename,rbuff+4);fd=fopen(filename,"wb");if(fd==NULL){printf("open file %s for write failed!\n",filename);return 0;} sprintf(sbuff,"put file %s",filename);if(!send(sock1,sbuff,1024,0)){ fclose(fd);return 0;}while((count=recv(sock1,rbuff,1024,0))>0) fwrite(rbuff,sizeof(char),count,fd);fclose(fd);}//putif(strncmp(rbuff,"dir",3)==0){strcpy(sbuff,rbuff);send(sock1,sbuff,1024,0);SendFileList(sock1);}if(strncmp(rbuff,"cd",2)==0){strcpy(filename,rbuff+3);strcpy(sbuff,rbuff);send(sock1,sbuff,1024,0);SetCurrentDirectory(filename);}closesocket(sock1);}}}四、结果分析(或测试)1、客户端启动后一直处于监听状态,如图[3]所示:图[3].监听2、再启动服务端,然后可以进行查询列表,上传,下载文件。

相关主题