FTP服务器与客户端设计与开发

合集下载

FTP客户端设计与开发

FTP客户端设计与开发

摘要FTP是Internet上用来传送文件的协议。

它是为了我们能够在Internet 上互相传送文件而制定的文件传送标准,规定了Internet上文件如何传送。

通过FTP协议,我们就可以跟Internet上的FTP服务器进行文件的上传或下载。

本文以实现一个简单易用的FTP客户端为目标,通过分析FTP协议的基本工作原理和FTP的数据传输原理,研究如何使用VC+=工具对FTP客户端进行设计,用VC++6.0编程工具设计和实现了FTP服务与客户端设计,从而实现了对FTP 客户端的开发。

关键词: VC++;文件传输协议;客户端AbstractFTP is a protocol used to transfer files on the Internet. It is enacted in order that we can send each other files on the Internet file transfer standards, regulations on how to send files on the Internet. Through the FTP protocol, we can tell the FTP server on the Internet for file upload or download. This article is an easy-to-use FTP client in order to achieve the goal through the analysis of the basic working principle of the FTP protocol and FTP data transmission principle, how to use VC + = tools FTP client to design, designed using VC + +6.0 programming tools and FTP service, and client design that enables the development of the FTP clientKey words:VC++; FTP, Client目录论文总页数:21页1引言 (1)1.1课题背景 (1)1.2国内外研究现状 (1)1.3本课题研究的意义 (1)1.4本课题的研究方法 (2)2技术背景 (2)2.1VC++技术简介 (2)2.2FTP简介 (2)2.3FTP工作模式 (3)2.4SSL协议加密 (3)3FTP软件需求分析...................................................................................................错误!未定义书签。

设计一 FTP服务器配置和客户端使用

设计一 FTP服务器配置和客户端使用

设计一FTP服务器配置和客户端使用
【需求】
◆本设计中,Fedora操作系统所有的配置都在3级运行级别下进行!
◆设置Fedora的网卡eth0,使其IP为192.168.2.11,子网掩码为255.255.255.0,并设
Windows XP的本地连接IP为192.168.2.22,子网掩码为255.255.255.0;
◆在Fedora系统中安装vsftpd服务器端;
◆在Fedora系统3级运行级别下配置vsfptd服务器,开启相应的服务,并用“rjxy”
用户连接本地FTP服务器(ftp 127.0.0.1);
◆在Fedora系统中用特殊方法创建新用户“tf”,要求归属于tf群组,宿主目录为
/home/tf,并为此用户设置一个有效密码;
◆用虚拟机中的Windows XP系统用“tf”用户连接FTP服务器,并分别查看本地主
机和远程主机的当前目录;
◆在远程主机的当前目录下创建新目录“d2”;把远程主机的文件“/media/rjxy/f2”
下载到本地主机的“c:\”目录下,若此文件不存在,需先创建,并查看是否已经下载成功;在本地主机当前目录下创建文件“f3.txt”,将此文件上传到FTP的“/home/rjxy”目录中并改名为“f3.c”
【系统及软件环境】
操作系统:Virtualbox,Fedora 13,Windows XP
【配置文件及命令】
1.配置文件:/etc/sysconfig/network-scripts/ifcfg-eth0
2.命令:ifconfig,ftp,ls ,cd,lcd,!cd,pwd,get,put等
【详细步骤】。

计算机网络课程设计书(FTP服务的设计与实现)

计算机网络课程设计书(FTP服务的设计与实现)

课程设计书四川理工学院课程设计书系别:计算机学院专业:计算机网络班级:FTP服务的设计与实现题目:计算机网络技术**:***学生:杨小兰、许平、任杰第 1 页共36 页课程设计书目录第一章序言 (3)1.1课题来源 (3)1.2开发工具 (3)第二章系统需求分析 (4)2.1功能需求 (4)2.2 系统模型设计 (5)2.3 系统工作流程设计 (5)第三章系统总体设计 (6)3.1需求规定 (6)3.2运行环境 (7)3.3基本设计概念和处理流程 (7)第四章系统详细设计 (13)4.1实现功能 (13)4.2函数说明 (13)4.2.1界面设计代码 (13)4.2.2功能实现函数 (13)第五章系统实现 (20)5.1界面设计的实现 (20)5.1.1连接服务器 (20)5.1.2获取文件列表 (21)5.1.3断开服务器 (21)5.1.4上传文件 (22)5.1.5下载 (24)5.1.6重命名 (26)5.1.7删除 (27)5.1.8刷新 (29)5.1.9返回上一目录 (29)5.1.10查看日志信息 (30)第六章测试、运行与维护 (31)6.1测试 (31)6.2单元测试 (31)6.3功能测试 (32)6.4安装、部署测试 (32)6.5 系统综合测试 (33)第 2 页共36 页课程设计书6.6系统运行及维护 (33)第七章总结 (34)第八章参考文献 (34)第一章序言——杨小兰1.1课题来源FTP(File Transfer Protocol, FTP)是TCP/IP网络上两台计算机传送文件的协议,FTP是在TCP/IP网络和INTERNET上最早使用的协议之一,它属于网络协议组的应用层。

FTP客户机可以给服务器发出命令来下载文件,上载文件,创建或改变服务器上的目录。

FTP是一个8位的客户端-服务器协议,能操作任何类型的文件而不需要进一步处理,就像MIME或Unencode一样。

ftp服务客户端设计

ftp服务客户端设计

FTP客户端设计说明书一、概述客户端感觉上要比服务器端简单一些,其实不然。

就我的开发体会而言,服务器端只要侦听21号端口,若有请求就打开控制通道,然后等待用户的命令做出相应的响应,并打开数据通道进行数据传输(目录列表或者文件),除了某些命令(例如USER和PASS),大部分的命令都是独立的,这就使得服务器端并不会存在复杂的有限状态机,特别是当我们并不需要实现其所有命令的时候(实际上我们实现了15条命令,具体见《协议说明书》)。

而客户端则是根据功能需求向服务器端发出各种指令来完成的,但是一些稍复杂的功能,例如目录的下载(或上传),服务器端并不提供这条命令,但是我们可以通过发出一系列其服务器提供的命令的组合来达到这个效果,生成这个命令组合便是客户端需要做的事之一。

这就有点像服务器提供少量“机器指令”,客户端则用这些少量的“机器指令”去“搭积木”来完成功能需求。

除此之外,客户端还要提供更多的图形元素,例如本地和远程的文件目录列表等。

在我们这个客户端的设计中,我们共完成了登陆,退出,列目录,下载/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传以及传输过程中状态计算(比如下载速度,下载时间和剩余时间、传输进度百分比的计算等等)等功能,并通过多线程的方法使得整个软件不至于在下载或上传时出现由于某个函数的繁忙计算而导致界面“死掉”的情况。

由于我们是并行开发的,即我完成客户端,同时方超和单梦凡完成服务器端,所以我在开发时就没法用他们写的服务器端来进行测试。

取而代之的是,我用了主流的FTP服务器端软件Serv-U来测试我写的客户端。

二、开发目标设计并实现一个符合标准FTP协议规范的,拥有登陆,退出,列目录,下载/上传文件,下载/上传目录,删除文件/目录,新建目录,断点续传以及传输过程中状态计算等功能的FTP客户端软件。

三、开发工具和平台Visual C++ 6.0,在Windows XP SP3下开发。

FTP客户端和服务器源代码(C语言)实现

FTP客户端和服务器源代码(C语言)实现

课程设计:FTP的设计与实现/****************client.c****************/#include <winsock2.h>#include <stdio.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")#define DEFAULT_PORT 2302#define DEFAULT_BUFFER 2048#define DEFAULT_MESSAGE "This is a test of the emergency \ broadcasting system" char szServerip[128], // Server to connect toszMessage[1024]; // Message to send to severint iPort = DEFAULT_PORT; // Port on server to connect to//DWORD dwCount = DEFAULT_COUNT; // Number of times to send message BOOL bSendOnly = FALSE; // Send data only; don't receiveint dirfun();int getfun();int putfun();int pwdfun();int cdfun();int mdfun();int delfun();int usafun();void usage(){printf("usage: client [-p:x] [-s:IP] [-n:x] [-o]\n\n");printf(" -p:x Remote port to send to\n");printf(" -s:IP Server's IP address or hostname\n");printf(" -n:x Number of times to send message\n");printf(" -o Send messages only; don't receive\n");ExitProcess(1);}void ValidateArgs(int argc, char **argv){int i;for(i = 1; i < argc; i++){if ((argv[i][0] == '-') || (argv[i][0] == '/')){switch (tolower(argv[i][1])){case 'p': // Remote portif (strlen(argv[i]) > 3)iPort = atoi(&argv[i][3]);break;case 's': // Serverif (strlen(argv[i]) > 3)strcpy(szServerip, &argv[i][3]);break;case 'n': // Number of times to send messageif (strlen(argv[i]) > 3)//dwCount = atol(&argv[i][3]);break;case 'o': // Only send message; don't receive bSendOnly = TRUE;break;default:usage();break;}}}}int main(int argc, char **argv){WSADATA wsd;SOCKET sClient;char szBuffer[DEFAULT_BUFFER];int ret;//unsigned int i;//int j;struct sockaddr_in server;struct hostent *host = NULL;char choice[5],choice2[40];// Parse the command line and load Winsock//argv[1]="-s:127.0.0.1";strcpy(szServerip, &argv[1][3]);//ValidateArgs(argc, argv);if (WSAStartup(MAKEWORD(2,2), &wsd) != 0){printf("Failed to load Winsock library!\n");return 1;}//strcpy(szMessage, DEFAULT_MESSAGE);// Create the socket, and attempt to connect to the server//sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sClient == INVALID_SOCKET){printf("socket() failed: %d\n", WSAGetLastError());return 1;}server.sin_family = AF_INET;server.sin_port = htons(iPort);printf("server.sin_port=%u\n",server.sin_port);server.sin_addr.s_addr = inet_addr(szServerip);//// If the supplied server address wasn't in the form// "c.ddd" it's a hostname, so try to resolve it//if (server.sin_addr.s_addr == INADDR_NONE){host = gethostbyname(szServerip);if (host == NULL){printf("Unable to resolve server: %s\n", szServerip);return 1;}CopyMemory(&server.sin_addr, host->h_addr_list[0],host->h_length);}if (connect(sClient, (struct sockaddr *)&server,sizeof(server)) == SOCKET_ERROR){printf("connect() failed: %d\n", WSAGetLastError());return 1;}//显示接通信息//////for(j=0;j<2;j++)//{ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR)printf("recv() failed: %d\n", WSAGetLastError());return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(ret<15){ret = recv(sClient, szBuffer, DEFAULT_BUFFER, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){//printf("recv() failed: %d\n", WSAGetLastError());return 0;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);}//printf("DEFAULT_BUFFER=%d\n",DEFAULT_BUFFER);}while(1){puts("------------------------------------------");printf("ftp> ");scanf("%s", choice);if(strncmp(choice,"dir",3)==0||strncmp(choice,"DIR",2)==0){dirfun(sClient);continue;}else if(strncmp(choice,"pwd",3)==0||strncmp(choice,"PWD",3)==0) {pwdfun(sClient);continue;}else if(strncmp(choice,"?",1)==0){usafun(sClient);continue;else if(strncmp(choice,"quit",4)==0||strncmp(choice,"QUIT",2)==0) {break;}scanf("%s", choice2);if(strncmp(choice,"get",3)==0||strncmp(choice,"GET",3)==0){getfun(sClient,choice2);continue;}else if(strncmp(choice,"put",3)==0||strncmp(choice,"PUT",3)==0) {putfun(sClient,choice2);continue;}else if(strncmp(choice,"cd",2)==0||strncmp(choice,"CD",2)==0){cdfun(sClient,choice2);continue;}else if(strncmp(choice,"md",2)==0||strncmp(choice,"MD",2)==0){mdfun(sClient,choice2);continue;}else if(strncmp(choice,"del",3)==0||strncmp(choice,"DEL",3)==0){delfun(sClient,choice2);continue;}//elseputs("输入错误,请重新输入");fflush(stdin);fflush(stdin);printf("\n");printf("\n");}closesocket(sClient);WSACleanup();}int dirfun(SOCKET sClient){int ret;char *MSG="dir$";char szBuffer[80];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示//ret = recv(sClient, szBuffer, 80, 0);//printf("%s",szBuffer);ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}return 0;}int getfun(SOCKET sClient,char filename[40]){int ret;FILE *fpre;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "get$");//strcat(szMessage, "\\");strcat(szMessage,filename);//printf("MSG[4]=%c\n",szMessage[4]);//szMessage[0]='g';szMessage[1]='e';szMessage[2]='t';////szMessage[4]='m';szMessage[5]='e';szMessage[6]='.';szMessage[7]='t';////szMessage[8]='x';szMessage[9]='t';szMessage[10]='\0';ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);ret = recv(sClient, szBuffer, 80, 0);/*if (ret == 0) // Graceful closebreak;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());break;}*/szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp( szBuffer,"125 Transfering...",strlen("125 Transfering...") )==0) {if( (fpre=fopen(filename,"w")) == NULL ){printf("open errer");return 1;printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';//printf("%s",szBuffer);if(strncmp(szBuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}fprintf(fpre,"%s",szBuffer);}printf("%s\n",szBuffer);fclose(fpre);}return 0;}int putfun(SOCKET sClient,char filename[40]){int ret;//int i;FILE *fpse;//char *filename;//char *MSG="get\0me.txt";char szBuffer[80],temp_buffer[80];//sprintf(szMessage, "get\0","te.txt\0");szMessage[0]='\0';strcat(szMessage, "put$");strcat(szMessage,filename);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 0;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}//printf("Send %d bytes\n", ret);//filename="me.txt";printf("filename=%s\n",filename);if( (fpse=fopen(filename,"r")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);//i=0;while (fgets(temp_buffer,80,fpse)!=NULL){sprintf(szBuffer,"%s",temp_buffer);send(sClient, szBuffer, 80, 0);}}sprintf(szBuffer, "226 Transfer completed... \r\n");ret = send(sClient, szBuffer, strlen(szBuffer), 0);fclose(fpse);return 0;}int pwdfun(SOCKET sClient){int ret;char *MSG="pwd$";char szBuffer[160];strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage), 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);printf("bSendOnly=%d\n",bSendOnly);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 160, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';printf("%s\n",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return 0;}int cdfun(SOCKET sClient,char pathname[40]){int ret;szMessage[0]='\0';strcat(szMessage, "cd$");strcat(szMessage,pathname);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);return 0;}int mdfun(SOCKET sClient,char pathname[20]){int ret;char szBuffer[160];//char *MSG="md$";szMessage[0]='\0';strcat(szMessage, "md$");//strcat(szMessage, "\\");strcat(szMessage,pathname);//strcpy(szMessage, MSG);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){//读取流并显示ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';printf("%s",szBuffer);if(strncmp(szBuffer,"226 Close",strlen("226 Close"))==0){break;}if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0){break;}}return 0;}int delfun(SOCKET sClient,char name[20]){int ret;char szBuffer[80];szMessage[0]='\0';strcat(szMessage, "del$");strcat(szMessage,name);ret = send(sClient, szMessage, strlen(szMessage)+1, 0);if (ret == 0)return 1;else if (ret == SOCKET_ERROR){printf("send() failed: %d\n", WSAGetLastError());return 1;}printf("Send %d bytes\n", ret);while(!bSendOnly){ret = recv(sClient, szBuffer, 80, 0);if (ret == 0) // Graceful closereturn 1;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 1;}szBuffer[ret] = '\0';if(strncmp(szBuffer,"del ok",strlen("del ok"))==0){printf("del %s ok\n",name);break;}printf("%s",szBuffer);if(strncmp(szBuffer,"500 Syntax error",strlen("500 Syntax error"))==0) {break;}}return 0;}int usafun(){puts("------------------------------------------");puts("get:取远方的一个文件");puts("put:传给远方一个文件");puts("pwd:显示远主当前目录");puts("dir:列出远方当前目录");puts("md :在远方新建文件夹");puts("cd :改变远方当前目录");puts("?:显示你提供的命令");puts("quit :退出返回");return 0;}//int quit()/****************server.c****************/#include <stdio.h>#include <winsock.h>#include <stdlib.h>#pragma comment(lib,"ws2_32.lib")WSADATA wsd;char sbuffer[80],rbuffer[80];//send and receive buffersint n,bytes;//countersSOCKET newsocket,ns_data;struct sockaddr_in remoteaddr; //remoteaddr_data;int port_connect=0;//port connect flagchar path[80]="";char order[100]="";//SOCKET s_data_port;int sy_error=1; // use for indicate Syntax error//server functionsint sdirfun(SOCKET newsocket);int sgetfun(SOCKET newsocket);int sputfun(SOCKET newsocket);int spwdfun(SOCKET newsocket);int scdfun(SOCKET newsocket);int smdfun(SOCKET newsocket);int sdelfun(SOCKET newsocket);void HandleError(char *func);//server functions end//MAINint main(int argc, char *argv[]){struct sockaddr_in localaddr;//local address structureSOCKET s;//s_data;//welcome socket and welcome socket for data connection,and port connection for connect to clientint addr_inlen;//address lenght variableif (WSAStartup(MAKEWORD(2,2), &wsd) != 0){WSACleanup();printf("WSAStartup failed\n");}memset(&localaddr,0,sizeof(localaddr));//clear localaddrs = socket(PF_INET, SOCK_STREAM, 0);if (s <0){printf("socket failed\n");}localaddr.sin_family = AF_INET;if(argc == 2)localaddr.sin_port = htons((u_short)atoi(argv[1]));elselocaladdr.sin_port = htons(2302);localaddr.sin_addr.s_addr = INADDR_ANY;if (bind(s,(struct sockaddr *)(&localaddr),sizeof(localaddr)) < 0){printf("Bind failed!\n");}//INFINITE LOOPwhile (1){ // while loop 1//LISTENlisten(s,3);addr_inlen = sizeof(remoteaddr);//ACCEPT main connection (control connection)newsocket = accept(s,(struct sockaddr *)(&remoteaddr),&addr_inlen);if (newsocket == INVALID_SOCKET) break;printf("connected to %s at port %d \n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));//Respond with welcome message, FTP client requires thosesprintf(sbuffer,"200 Welcome \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer,"530 Log in \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//INFINITE LOOPwhile (1) // while loop 2{n = 0;sy_error=1;while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[n], 1, 0);printf("rbuffer[%d]=%c\n",n,rbuffer[n]);if ((bytes < 0) || (bytes == 0))break;if (rbuffer[n] == '$'){rbuffer[n] = '\0';break;}if (rbuffer[n] != '\r')n++;} // end of while loop 3if ((bytes < 0) || (bytes == 0))break;printf("#The Server receives:# '%s' from client \n", rbuffer); //THE FTP COMMANDS HERE//LISTif(strncmp(rbuffer,"dir",3)==0){sdirfun(newsocket);}//当前目录if(strncmp(rbuffer,"pwd",3)==0){spwdfun(newsocket);}//改变目录if (strncmp(rbuffer,"cd",2)==0){scdfun(newsocket);}//GETif (strncmp(rbuffer,"get",3)==0){sgetfun(newsocket);}//PUTif (strncmp(rbuffer,"put",3)==0){sputfun(newsocket);}//MDif (strncmp(rbuffer,"md",2)==0){smdfun(newsocket);}if (strncmp(rbuffer,"del",3)==0){sdelfun(newsocket);}//QUITif (strncmp(rbuffer,"quit",4)==0){printf("quit \n");sprintf(sbuffer, "221 Bye bye ... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sy_error=0;break;}//Syntax errorif (sy_error==1){printf("command unrecognized, non-implemented!\n");sprintf(sbuffer, "500 Syntax error. \n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}} // end of while loop 2//CLOSE CONTROL SOCKETclosesocket(newsocket);printf("disconnected from %s at port %d, close control socket.\n",inet_ntoa(remoteaddr.sin_addr),ntohs(localaddr.sin_port));} // end of while loop 1//CLOSE WELCOME SOCKETclosesocket(s);printf("Welcome sockets close");return 0;}int sdirfun(SOCKET newsocket){char temp_buffer[80];printf("Equivalent to dir \n");order[0]='\0';strcat(order,"dir ");strcat(order,path);strcat(order," >tmp.txt");system(order);FILE *fin;fin=fopen("tmp.txt","r");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fin)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sgetfun(SOCKET newsocket){printf("RETR mode.\r\n");int i=4,k=0;char filename[20],temp_buffer[80];// identify the filename from rbuffer after the word "RETR "while (1) // while loop 4{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of while loop 4order[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);char *p_filename=order;FILE *fp;if( (fp=fopen(p_filename,"r")) == NULL ){sprintf(sbuffer, "Sorry, cannot open %s. Please try again.\r\n",filename);bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);return 1;}else{printf("The file %s found,ready to transfer.\n",filename);sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);while (fgets(temp_buffer,80,fp)!=NULL){sprintf(sbuffer,"%s",temp_buffer); //if (port_connect==0)send(newsocket, sbuffer, strlen(sbuffer), 0);}//end of whilefclose(fp);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);}sy_error=0;return 0;}int sputfun(SOCKET newsocket){printf("Equivalent to put. \n");int i=4,k=0;char filename[20];// identify the filename from rbuffer after the word "RETR "while (1){bytes = recv(newsocket, &rbuffer[i], 1, 0);if ((bytes < 0) || (bytes == 0))break;filename[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/filename[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}} // end of whileorder[0]='\0';strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,filename);printf("filename=%s,",order);char *p_filename=order;FILE *fpse;if( (fpse=fopen(order,"w")) == NULL ){printf("open errer");return 1;}else{printf("The file %s found,ready to transfer.\n",filename);while(1){//读取流并显示int ret;ret = recv(newsocket, rbuffer, 80, 0);if (ret == 0) // Graceful closereturn 0;else if (ret == SOCKET_ERROR){printf("recv() failed: %d\n", WSAGetLastError());return 0;}if(strncmp(rbuffer,"226 Transfer",strlen("226 Transfer"))==0){break;}fprintf(fpse,"%s",rbuffer);}printf("RBUFFER=%s",rbuffer);fclose(fpse);}sy_error=0;return 0;}int spwdfun(SOCKET newsocket){printf("Equivalent to pwd \n");//order[0]='\0';//strcat(order,"dir ");//strcat(order,path);//strcat(order,);system("cd >tmp.txt");FILE *fin;fin=fopen("tmp.txt","r+");sprintf(sbuffer, "125 Transfering... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);char temp_buffer[160];while (fgets(temp_buffer,80,fin)!=NULL){temp_buffer[strlen(temp_buffer)-1]='\0';printf("temp_buffer=%s",temp_buffer);///////////////////////////////目录判定if(path[0]!='\0')sprintf(sbuffer,"%s\\%s",temp_buffer,path);elsesprintf(sbuffer,"%s",temp_buffer);///////////////////////////////if (port_connect==0)//send(ns_data, sbuffer, strlen(sbuffer), 0);send(newsocket, sbuffer, strlen(sbuffer), 0);}fclose(fin);sprintf(sbuffer, "226 Transfer completed... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);system("del tmp.txt");//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int scdfun(SOCKET newsocket){int i=3,k=0;char name[20],name2[20];int j,count=0;//path overfollowint pathlen;printf("Equivalent to cd \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];name2[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';name2[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileif(path[0]!='\0')strcat(path,"\\");strcat(path,name);if(strncmp(name2,"..",2)==0){pathlen=strlen(path);for(j=pathlen-1;j>=0;j--){if(path[j]=='\\'){path[j]='\0';count++;}if(count==2){//path[j]='\0';break;}}printf("%d=\n",j);path[j+1]='\0';}printf("path=%s",path);sy_error=0;return 0;}int smdfun(SOCKET newsocket){char name[20];int i=3,k=0;printf("Equivalent to md \n");while (1) // while loop 3{//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){ /*end on LF*/name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;/*ignore CR's*/}}order[0]='\0';strcat(order,"md ");strcat(order,path);if(strlen(path)>0)strcat(order,"\\");strcat(order,name);system(order);//CLOSE the ns_data SOCKET or data port SOCKETif(port_connect==0){//closesocket(ns_data);sprintf(sbuffer,"226 Close the data socket... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);//ns_data = socket(AF_INET, SOCK_STREAM, 0);}sy_error=0;return 0;}int sdelfun(SOCKET newsocket){int i=3,k=0;char name[20];printf("Equivalent to del \n");while (1){//RECEIVEbytes = recv(newsocket, &rbuffer[i], 1, 0);printf("rbuffer[i]=%c\n",rbuffer[i]);printf("bytes=%d\n",bytes);if ((bytes < 0) || (bytes == 0))break;name[k]=rbuffer[i];if (rbuffer[i] == '\0'){name[k] = '\0';break;}if (rbuffer[i] != '\r'){i++;k++;}}//end whileorder[0]='\0';strcat(order,"rd ");strcat(order,path);if(path[0]!='\0')strcat(path,"\\");strcat(order,name);system(order);sprintf(sbuffer,"del ok... \r\n");bytes = send(newsocket, sbuffer, strlen(sbuffer), 0);if (bytes == SOCKET_ERROR){HandleError("recv()");sy_error=1;return 1;}sy_error=0;return 0;}void HandleError(char *func){char info[65]= {0};_snprintf(info, 64, "%s: %d\n", func, WSAGetLastError());printf(info);}。

FTP客户端软件的设计与开发

FTP客户端软件的设计与开发

一、设计思想本软件了解通过FTP协议传送文件的方法,学会使用C#实现一个简单的FTP客户端。

随着计算机网络的完善和成熟人们通过FTP下载资源也普遍增加,特别是对于局域网用户,FTP服务器大大方便了同学们共享资源。

FTP协议(File Transfer Protocol)即远程文件传输协议,是一个用于简化IP网络上系统之间文件传送的协议,FTP是TCP/IP的一种具体应用,它工作在OSI模型的第 7层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,FTP建立的就是一个可靠的连接。

采用FTP协议可使 Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。

以达到资源共享和传递信息的目的。

由于FTP 的使用使得Internet上出现大量为用户提供的下载服。

Internet成为了一个巨型的软件仓库。

将使用两条单独的TCP连接,一条专用于发送FTP命令,称为控制连接,另一条则专用于传递数据, 称为数据连接。

1)控制连接客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。

2)数据连接FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。

FTP 数据连接就是FTP传输数据的过程,它有两种传输模式PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。

当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。

于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条数据链路来传送数据。

PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。

FTP客户端的设计与实现

FTP客户端的设计与实现

FTP客户端的设计与实现1. 简介FTP(File Transfer Protocol)是一种用于文件传输的标准协议。

FTP客户端是指使用FTP协议与FTP服务器进行通信并传输文件的程序。

在本文中,我们将探讨FTP客户端的设计与实现。

2. 设计2.1 功能需求FTP客户端的主要功能需求包括:1.连接到FTP服务器2.在FTP服务器和本地电脑之间传输文件3.列出FTP服务器上的文件和目录4.创建和删除FTP服务器上的目录5.重命名FTP服务器上的文件6.支持多种操作系统(如Windows、Linux等)2.2 架构设计FTP客户端采用MVC(Model-View-Controller)模式来设计,其中:•Model层:管理FTP客户端的业务与数据逻辑。

提供FTP相关的API,封装了FTP协议的底层实现。

•View层:处理和呈现用户界面。

•Controller层:处理用户请求,调用Model层实现相关业务逻辑。

2.3 技术选型FTP客户端的技术选型如下:•编程语言:Java•GUI框架:JavaFX•FTP库:Apache Commons Net•构建工具:Maven•版本控制:Git2.4 待解决问题FTP客户端在设计中会遇到以下问题:1.如何扩展支持更多的FTP协议?2.如何实现可靠的文件传输?3.如何提高用户界面的体验?3. 实现3.1 界面实现使用JavaFX框架实现FTP客户端的用户界面。

主要界面包括:•登录界面:输入FTP服务器地址、用户名和密码登录FTP服务器。

•主界面:显示FTP服务器上的文件和目录,并提供文件传输和操作的操作界面。

3.2 功能实现FTP客户端通过Apache Commons Net库实现FTP底层协议。

实现的功能包括:1.连接到FTP服务器FTPClient ftp = new FTPClient();ftp.connect(server, port);ftp.login(username, password);2.在FTP服务器和本地电脑之间传输文件ftp.retrieveFile(remoteFile, localFile);ftp.storeFile(remoteFile, localFile);3.列出FTP服务器上的文件和目录FTPFile[] files = ftp.listFiles(remoteDir);4.创建和删除FTP服务器上的目录ftp.mkd(remoteDir);ftp.rmd(remoteDir);5.重命名FTP服务器上的文件ftp.rename(from, to);4. 总结通过对FTP客户端的设计与实现,我们了解了FTP协议的底层实现和FTP客户端的主要功能。

FTP客户端与服务器设计与实现课设报告

FTP客户端与服务器设计与实现课设报告

本科生专业方向应用实训科研训练FTP客户端与服务器的设计与实现Design and implementation of and server学生姓名蒲凤专业软件工程学号140521221指导教师高培成尹大力祝勇学院计算机科学技术二〇一七年七月摘要随着互联网技术的飞速发展,信息共享的时代己经到来。

在实现数据传输与信息共享的诸多方式中,FTP无疑是应用最广的一种方式。

FTP协议是计算机网络中的应用层协议,提供了可靠的文件传输功能,并且具有跨平台特性,两个不同类型的操作系统只要都支持FTP协议就可以进行文件传输工作。

因此,探讨文件传输协议(FTP)的内容和工作原理,分析F'I'P客户端与服务器的连接过程及F'I'P请求与应答工作模式,设计C/S架构下的FTP系统的实现方案,在.NET平台利用C#语言搭建起FTP系统的窗体界面,并且使用.NET类库实现了文件上传、删除和修改等功能。

关键词:FTP协议服务器客户端 .NETAbstractWith the rapid development of Internet technology, the era of information sharing has arrived. In many ways of realizing data transmission and information sharing, undoubtedly the most widely used method. is an application layer protocol in computer network, provides a reliable function, and has the characteristics of cross platform, two different types of operating system as long as can support the for work. Therefore, to explore the protocol (FTP) content and working principle, analysis of the connection process and the F'I'P request and response mode F'I'P the client and the server implementation scheme of design under the C/S framework, the window body platform using C# language to build , and use Library to achieve the , delete and modify functions.Key words: ;server;client;.net目录摘要 (I)ABSTRACT ........................................................... I I 第一章绪论 (1)1.1研究背景 (1)1.2国内外研究现状 (2)1.3课程设计主要研究内容和架构 (2)第二章需求分析 (2)2.1需求分析 (3)2.2功能列表 (3)2.3系统权限 (3)第三章技术方案 (4)架构平台 (4)3.1.1 .NET的体系结构 (4)3.1.2 .NET框架的特色 (4)3.2开发工具 (5)3.2.1 Visual Studio (5)第四章总体设计 (6)4.1系统体系结构模型 (6)4.2FTP系统模型 (6)4.3系统工作流程设计 (7)4.4系统功能模块介绍 (8)4.2.1登陆与注销 (8)4.2.2模式选择 (9)4.2.3文件管理 (9)4.2.4目录管理 (9)第五章详细设计 (10)5.1登陆与注销 (10)5.2文件管理 (11)5.2.1文件下载 (11)5.2.2文件上传 (11)5.2.3 文件重命名 (12)5.2.4 文件删除 (12)5.4目录管理 (13)5.4.1目录显示 (13)5.4.2目录切换 (13)5.4.3目录添加 (14)5.4.4目录重命名 (15)5.4.5目录删除 (15)第六章软件测试 (16)6.1测试方法 (16)6.2测试用例 (16)6.3测试过程及结果 (17)第七章总结 (19)参考文献 (20)附录 (21)第一章绪论网络的首要目的就是实现信息共享,文件传输是其中重要的一个方面,随着Internet的迅猛发展,信息数据的传输量大大增加,数据的网络传输显得越来越重要。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FTP服务器与客户端设计与开发详细设计程序包括5个主要功能:1.服务器的运行:启动和停止FTP服务2.用户管理:添加用户,删除用户和设置用户权限3.服务器配置:设置服务器开放端口,最大连接数等4.运行统计:统计当前服务器运行时期上传下载的流量等等5.安全设置:允许连接服务器的IP列表,以及禁止访问的IP服务器的运行模块功能:负责FTP服务器的运行。

使用类:CFTPServer类,CApplicationDlg类,CListenSocket类,CConnectThread类,CConnectSocket类各种类的功能:1.CFTPServer类:是CWnd的子类,作为程序的顶层类,负责实现或者调用各个成员函数2.CApplicationDlg类:CDialog类的子类,实现程序主窗口。

3.CListenSocket类:负责监听FTP客户端连接,并实现有效连接onnectThread类:负责实现并保证多个连接的有效性。

onnectSocket类:实现FTP命令的解析,数据的发送和接收CFTPServer类作为服务器的顶层类,实现服务器开始运行时的所有成员函数申明如下:class CFTPServer : public CWnd{friend CConnectSocket;//CConnectSocket作为其友元类,可以访问内部私有数据成员public:void SetGoodbyeMessage(LPCTSTR lpszText);//发送退出信息void SetWelcomeMessage(LPCTSTR lpszText);//发送欢迎信息void SetTimeout(int nValue);//设置暂停时间void SetPort(int nValue);//设置端口void SetMaxUsers(int nValue);//设置最大连接数void SetStatisticsInterval(int nValue);//统计时间间隔BOOL IsActive();//是否有效void Stop();BOOL Start();CFTPServer();virtual ~CFTPServer();CUserManager m_UserManager;//用户管理对象CSecurityManager m_SecurityManager;//安全策略CFTPServer类最主要的成员函数是start()和stop(),分别负责ftp服务器的开始运行和结束运行函数声明如下:/********************************************************************//* *//* Function name : Start *//* Description : Start listining on port 21 and accept new *//* connections. *//* *//********************************************************************/BOOL CFTPServer::Start(){if (m_bRunning)return FALSE;//如果运行,返回错误标志// create dummy window for message routingif (!CWnd::CreateEx(0, AfxRegisterWndClass(0), "FTP Server Notification Sink", WS_POPUP, 0,0,0,0, NULL, 0)){AddTraceLine(0, "Failed to create notification window.");return FALSE;}// 开始创建socketif (m_ListenSocket.Create(m_nPort)){// start listeningif (m_ListenSocket.Listen()){m_ListenSocket.m_pWndServer = this;m_bRunning = TRUE;SetTimer(1, m_nStatisticsInterval, NULL);AddTraceLine(0, "FTP Server started on port %d.", m_nPort);return TRUE;}}AddTraceLine(0, "FTP Server failed to listen on port %d.", m_nPort);// destroy notification windowif (IsWindow(m_hWnd))DestroyWindow();m_hWnd = NULL;return FALSE;}/********************************************************************/ /* */ /* Function name : Stop */ /* Description : Stop FTP server. */ /* */ /********************************************************************/ void CFTPServer::Stop(){if (!m_bRunning)return;// stop statistics timerKillTimer(1);m_bRunning = FALSE;m_ListenSocket.Close();CConnectThread* pThread = NULL;// close all running threadsdo{m_CriticalSection.Lock();POSITION pos = m_ThreadList.GetHeadPosition();if (pos != NULL){pThread = (CConnectThread *)m_ThreadList.GetAt(pos);m_CriticalSection.Unlock();// save thread membersint nThreadID = pThread->m_nThreadID;HANDLE hThread = pThread->m_hThread;AddTraceLine(0, "[%d] Shutting down thread...", nThreadID);// tell thread to stoppThread->SetThreadPriority(THREAD_PRIORITY_HIGHEST);pThread->PostThreadMessage(WM_QUIT,0,0);// wait for thread to end, while keeping the messages pumping (max 5 seconds)if (WaitWithMessageLoop(hThread, 5000) == FALSE){// thread doesn't want to stoppedAddTraceLine(0, "[%d] Problem while killing thread.", nThreadID);// don't try again, so removem_CriticalSection.Lock();POSITION rmPos = m_ThreadList.Find(pThread);if (rmPos != NULL)m_ThreadList.RemoveAt(rmPos);m_CriticalSection.Unlock();}else{AddTraceLine(0, "[%d] Thread successfully stopped.", nThreadID);}}else{m_CriticalSection.Unlock();pThread = NULL;}}while (pThread != NULL);AddTraceLine(0, "FTP Server stopped.");if (IsWindow(m_hWnd))DestroyWindow();m_hWnd = NULL;}CListenSocket类用于监听每个客户的连接,CListenSocket类是CAsyncSocket的子类,其成员函数listen 监听来自客户端的连接,当监听到可以接收的socket的时候通过OnAccept函数准备创建有效连接的进程。

函数如下:void CListenSocket::OnAccept(int nErrorCode){// New connection is being establishedCSocket sockit;// Accept the connection using a temp CSocket object.Accept(sockit);// Create a thread to handle the connection. The thread is created suspended so that we can// set variables in CConnectThread before it starts executing.CConnectThread* pThread =(CConnectThread*)AfxBeginThread(RUNTIME_CLASS(CConnectThread),THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);if (!pThread){sockit.Close();TRACE("Could not create thread\n");return;}CFTPServer *pWnd = (CFTPServer *)m_pWndServer;// since everything is successful, add the thread to our list pWnd->m_CriticalSection.Lock();pWnd->m_ThreadList.AddTail(pThread);pWnd->m_CriticalSection.Unlock();// save pointerpThread->m_pWndServer = m_pWndServer;// Pass the socket to the thread by passing the socket handle. You cannot pass // a CSocket object across threads.pThread->m_hSocket = sockit.Detach();// Now start the thread.pThread->ResumeThread();}CConnectThread类CConnectThread类负责为每个有效进程创建一个线程,每个进程完成数据传输的所有任务,穿件县城后通过InitInstance完成线程的初始化BOOL CConnectThread::InitInstance(){try{// Attach the socket handle to a CSocket object.// This makes sure that the socket notifications are sent to this thread.m_ConnectSocket.Attach(m_hSocket);m_ConnectSocket.m_pThread = this;CString strIPAddress;UINT nPort;m_ConnectSocket.GetPeerName(strIPAddress, nPort);// notify server that there's a new connectionm_pWndServer->SendMessage(WM_THREADSTART, (WPARAM)this, 0);if (((CFTPServer *)m_pWndServer)->CheckMaxUsers()){m_ConnectSocket.SendResponse("421 Too many users are connected, please try again later.");PostThreadMessage(WM_QUIT,0,0);}elseif (!((CFTPServer *)m_pWndServer)->IsIPAddressAllowed(strIPAddress)){m_ConnectSocket.SendResponse("421 Access denied, IP address was rejected by the server.");PostThreadMessage(WM_QUIT,0,0);}else{// send welcome message to clientCString strText = ((CFTPServer *)m_pWndServer)->GetWelcomeMessage();m_ConnectSocket.SendResponse("220 " + strText);m_nTimerID = ::SetTimer(NULL, 0, 1000, TimerProc);}}catch(CException *e){e->Delete();}return TRUE;}线程结束以后,通过ExitInstance函数实现资源的释放代码如下:int CConnectThread::ExitInstance(){CFTPServer *pWnd = (CFTPServer *)m_pWndServer;try{pWnd->m_CriticalSection.Lock();// delete this thread from the linked listPOSITION pos = pWnd->m_ThreadList.Find(this);if(pos != NULL){pWnd->m_ThreadList.RemoveAt(pos);}pWnd->m_CriticalSection.Unlock();// notify service main looppWnd->SendMessage(WM_THREADCLOSE, (WPARAM)this, 0);}catch(CException *e){pWnd->m_CriticalSection.Unlock();e->Delete();}return CWinThread::ExitInstance();}为了了解传输过程中接收和发送的字节数,使用IncReceivedBytes和IncSentBytes来计算。

相关文档
最新文档