FTP客户端说明书.docx
《FTP客户端说明书.docx》由会员分享,可在线阅读,更多相关《FTP客户端说明书.docx(13页珍藏版)》请在冰豆网上搜索。
FTP客户端说明书
目录
摘要2
1.FTP协议与原理3
1.1FTP简介3
1.2FTP运行原理3
1.3FTP工作原理4
2.系统分析5
2.1应解决的问题5
2.2功能分析5
2.3Ftp客户端设计思想5
2.4开发工具6
3.技术规格7
4.FTP协议命令及说明8
4.1CCommandSocket类8
4.2CFileSocket类8
4.3CReceiveSocket类9
4.4CPortSocket类9
4.5CFtpClient-DemoDlg类10
5.逻辑设计14
6.测试15
6.1系统可能出现的问题与不足15
6.2测试的过程与结果分析15
7.总结16
FTP客户端设计说明书
摘要
本程序是一个小型FTP服务器系统,实现了FTP服务器所应该具备的大多数功能,包括用户的登录,文件的上传、下载、删除,选择数据传输模式、目录选择等,并给出相应的提示。
通过该程序的开发,基本上实现了一个FTP服务器所应该具有的功能,能够解释一般的FTP命令,并且符合RFC959规范。
本软件的设计,即从需求分析,软件设计到软件功能实现,都始终遵循软件工程的思想和方法。
本文中采用了大量的图表说明,使文章明确清晰,便与阅读和理解。
本程序采用VC++6.0作为开发工具,设计步骤采用自顶向下的方法。
关键词:
上传;下载;VC++;FTP服务器
1.FTP协议与原理
1.1FTP简介
FTP是Internet上最早也是最广的应用,直到今天它仍是最重要和最基本的应用之一。
用FTP将信息下载到本地是一件十分普遍的事。
也随之出现了许多下载软件。
尽管远程登录(Telnet)提供了访问远程文件的极好方法,但怎么也比不上使用自己计算机中的文件方便。
如果用户想使用其它计算机上的文件,最理想的方法就是把它COPY到自己的计算机中,以便在本地计算机上操作。
FTP正是完成这项工作的工具,你可以在任意一个经过文件传输协议(FTP)访问的公共有效的联机数据库或文档中找到你想要的任何东西全世界现在已有成千上万个FTP文件服务器对所有INTERNET用户开使用,用户可以通Internet相连到远程计算机,把自己需要的文件传输过来或是把自己的收集传输上去与他人共享。
传统的数据库应用系统采用的是客户机/服务器(Client/Server)模式,有高度的交互性,高效的用户界面等优点。
FTP是TCP/IP协议组中的协议之一,是英文FileTransferProtocol的缩写。
该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。
简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。
若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。
在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。
1.2FTP运行原理
从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。
FTP协议采用客户机/服务器(Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。
使用时,先启动FTP客户端程序与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。
但是FTP有一个根本的限制,那就是,如果用户在某个主机上没有注册获得授权,即没有用户名和口令,就不能与该主机进行文件传输。
但匿名FTP服务器除外,它能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。
用户使用特殊的用户“Anonymous”或“guest”就可有限制地访问远程主机上公开的文件。
现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问者进行跟踪。
出于安全的目的,大部分匿名FTP主机一般只允许远程用户下(download)文件和上传文件。
1.3FTP工作原理
FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。
采用FTP协议可使Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。
以达到资源共享和传递信息的目的。
由于FTP的使用使得Internet上出现大量为用户提供的下载服务器。
Internet成为了一个巨型的软件仓库。
FTP在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。
2.系统分析
Ftp服务的设计与实现主要分为两部分来为客户实现Ftp服务:
一是服务器端的配置(windowsxpIIS部件演示),二是客户端(由本人设计开发)这也是本次设计的重点;系统流程为客户实现并解析服务器配置,以及客户端软件的开发及应用,主要在多个用户间提供资源共享服务。
2.1应解决的问题
设想好程序将要实现的大体功能后,我们就要分析该程序所需的条件,对该程序中将要遇到的问题做一下准备工作,以便于以后设计的顺利进行。
根据我们想要在局域网内进行文件传输的要求,首先,要选择在局域网内通讯;其次,因为本程序要实现的是FTP服务器功能,所以我们要建立服务器但是为了测试服务器是否能够有效运行,又配置了一个客户端。
2.2功能分析
在做程序之前,我们要先确定本程序的功能,只有确定了功能,才能确定程序中使用什么函数来实现。
如果想在局域网内进行文件传输,首先要有服务器端和客户端,两者配合使用。
先打开客户端和服务器,然后让客户登陆一下服务器,服务器端设制一下服务器所完成的功能,然后客户端在向服务器发送请求。
2.3Ftp客户端设计思想
在本次FTP的设计中主要使用vc++编程,无需考虑基本的通信协议和底层的数据传输工作,编译提供的WinInet类是对WinInetAPI函数封装而来的,它为用户提供了更加方便的编程接口。
而在该设计中,使用的类包括CCommandSocket类、CFileSocket类、CPortSocket类和CReceiveSocket类,其中,CCommandSocket用于创建一个Internet会话;CFileSocket完成文件发送上传操作;CReceiveSocket负责接收某一个目录下的所有文件和子目录; CPortSocket类负责根据数据来连接服务器。
程序的功能:
1.登陆到FTP服务器。
2.检索FTP服务器上的目录和文件。
3.根据FTP服务器给的权限,会相应地提供:
文件的上传、下载、等功能。
2.4开发工具
在WINDOWS环境下,使用VC++开发工具实现一个FTP客户端软件。
代码分析工具:
VC++6.0
流程图分析工具:
MicrosoftVisio2003
测试工具:
FTP服务器(个人FTP服务器)。
3.技术规格
FTP协议将使用两条单独的TCP连接,一条专用于发送FTP命令,另一条则专用于传递数据。
初始建立连接时,服务器在21号端口上接收来自客户端的命令连接。
当需要传送数据时(文件列表、文件数据等),客户端向服务器发出Port命令,并进入监听状态,等待来自服务器的数据连接请求。
使用时需输入用户名和密码,用户名和密码一致方可使用系统。
登录界面如下图所示:
实现技术:
(1)创建Internet会话,建立于FTP服务器的连接。
(2)检索登陆目录下的所有文件及其子目录
(3)上传、下载文件
(4)关闭与服务器的连接
首先我们利用VC++6.0的AppWizard创建一个基于对话框的应用程序,命名为FtpClientDemo。
为程序生成五个基于CAsyncSocket的新类,这里列出主要代码。
4.FTP协议命令及说明
4.1CCommandSocket类
CCommandSocket类的主要代码:
voidCCommandSocket:
:
OnReceive(intnErrorCode)
//这个函数使得服务器的应答消息显示在编辑框上
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,1024,0);
//接收应答消息
MessageList+=buffer;
m_ReturnMessage-〉SetWindowText(MessageList);
deletebuffer;
}
4.2CFileSocket类
CFileSocket类的主要代码:
voidCFileSocket:
:
OnReceive(intnErrorCode)
//函数将收到的文件数据写到文件中
if(File==NULL)
{File=newCFile();
File-〉Open(FileName,CFile:
:
modeWrite|CFile:
:
modeCreate);
}
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,4096,0);
ReceiveString=buffer;
File-〉Write(ReceiveString,ReceiveString.GetLength());
deletebuffer;
}
4.3CReceiveSocket类
CReceiveSocket类的主要代码:
voidCReceiveSocket:
:
OnReceive(intnErrorCode)
//接收服务器传来的文件列表消息
CStringReceiveString,Temp;
charbuffer=newchar[4096];
memset(buffer,0,4096);
this-〉Receive(buffer,4096,0);//接收消息
ReceiveString+=buffer;
deletebuffer;
//将文件列表从收到的消息字符串中分离出来,并显示在列表框中
while(!
ReceiveString.IsEmpty())
{intp=ReceiveString.Find("\r\n");
if(p!
=-1)
{Temp=ReceiveString.Left(p);
ReceiveString=ReceiveString.Right(ReceiveString.GetLength()-p-2);
DisplayMessage-〉AddString(Temp);
}
}
}
4.4CPortSocket类
CPortSocket类主要代码
voidCPortSocket:
:
OnAccept(intnErrorCode)
//根据不同的标志选择相应的数据连接类,以接受服务器端的数据连接请求
if(Flag==LISTFILE)
//若程序要求对目录进行列表,则采用CReceiveSocket类
{DataSocket=newCReceiveSocket(FileList);
this-〉Accept(DataSocket);
}
elseif(Flag==DOWNLOAD)
//若程序要求下载文件,则生成CFileSocket类的对象
{FileSocket=newCFileSocket(FileName);
this-〉Accept(FileSocket);
}
}
4.5CFtpClient-DemoDlg类
主对话框类CFtpClient-DemoDlg的主要代码
voidCFtpClientDemoDlg:
:
OnFileList()
//响应“文件列表”按钮、列表目录
{CStringTemp;
if(ControlSocket==NULL)
//连接到FTP服务器
ControlSocket=newCCommandSocket(&&m_ReturnMessage);
ControlSocket-〉Create();
m_Server.GetWindowText(Temp);
ControlSocket-〉Connect(Temp,21);
//FTP服务器在21号端口接收连接
}
m_User.GetWindowText(Temp);
Temp="USER"+Temp+"\r\n";
ControlSocket-〉Send(Temp,Temp.GetLength(),0);
//发User命令,验证用户
m_Pass.GetWindowText(Temp);//m_Pass为“口令”编辑框的对应控制
Temp="PASS"+Temp+"\r\n";
ControlSocket-〉Send(Temp,Temp.GetLength(),0);
//发Pass命令,校验口令
LisentPort(LISTFILE);
//数据连接的对象为目录列表
ControlSocket-〉Send("LIST\r\n",7,0);
//发List命令,要求列表目录
}
voidCFtpClientDemoDlg:
:
OnDownLoad()
//下载文件
CStringString;
LisentPort(DOWNLOAD);
//获得要下戴文件的文件名
m_LocalFile.GetWindowText(String);
//m_LocalFile为“文件名”编辑框的对应控制
String="RETR"+String+"\r\n";
ControlSocket-〉Send(String,String.GetLength(),0);
//发RETR命令,下载文件
}
voidCFtpClientDemoDlg:
:
LisentPort(UINTFlag)
//根据要求选择不同的数据连接对象
if(LisentSocket!
=NULL)
//清空LisentSocket
{LisentSocket-〉Close();
deleteLisentSocket;
LisentSocket=NULL;
}
if(Flag==LISTFILE)
//如果为目录列表数据连接对象
{LisentSocket=newCPortSocket(LISTFILE);
LisentSocket-〉SetListBox(&&m_FileList);
//传列表框到CLisentSocket类中
}
elseif(Flag==DOWNLOAD)
//如果为文件传输数据连接对象
{CStringString;
m_LocalFile.GetWindowText(String);
LisentSocket=newCPortSocket(DOWNLOAD);
LisentSocket-〉SetFileName(String);
//传文件名到CLisentSocket类中
}
LisentSocket-〉Create();
//建立Socket并进行监听,等待FTP服务器进行数据连接
LisentSocket-〉Listen();
//取得数据连接Socket的IP地址和监听端口,并把它们作为Port命令的参数
SOCKADDR_INlisting_address,control_address;
intaddr_size;
addr_size=sizeof(listing_address);
LisentSocket-〉GetSockName((SOCKADDR)&&listing_address,
&&addr_size);//取IP地址
ControlSocket-〉GetSockName((SOCKADDR)&&control_address,
&&addr_size);/
/取端口
unsignedcharport=(unsignedchar)&&(listing_address.sin_port);
unsignedcharhost=(unsignedchar)&&(control_address.sin_addr);
CStringstrBuffer;
strBuffer.Format("PORT%i,%i,%i,%i,%i,%i\r\n",(int)host[0],
(int)host[1],(
int)host[2],(int)host[3],(int)port[0],(int)port[1]);
ControlSocket-〉Send(strBuffer,strBuffer.GetLength(),0);
//发送Port命令,进行数据连接
}
以上代码在VC++6.0、WindowsXP上运行通过。
5.逻辑设计
该软件可以采用分层结构,每一层实现一个相对独立的功能,并向上层提供一个简单、有好、功能强大的接口。
这样便于系统的维护、扩充和优化。
逻辑结构
网络层,负责网络管理,通过编程工具的网络命令,实现数据的发送和接受。
可以抽象成流的形式,实现网络的抽象,即把对网络的操作,抽象成本地操作。
命令层,负责FTP命令的解释执行,并对返回码进行处理。
接口层,把FTP命令封装成文件操作,为用户层提供一个方便、简单的接口。
用户层,用户显示界面。
6.测试
6.1系统可能出现的问题与不足
经过几次的软件测试发现系统存在着一些不足之处。
具体为:
1)当客户端与服务器建立连接时,有时连接较慢。
2)当用户向服务器上传文件时可能会传输中断,服务器仍然存在一些不稳定的数据连接。
6.2测试的过程与结果分析
在编写程序时有时会遇到运行错误,这是由于有的地方代码编写错误只有改写一下就可以了。
首先因为创建的是服务器端,所以先登陆自己的服务器,为了查看服务器是否能够运行,又配置来了一个客户端,在二台电脑中实现客户端与服务器端之间文件的传输。
首先用客户端登陆服务器,与服务器建立连接,然后上传,下载文件,看看服务器端有什么反应,但是有时会发现虽然建立了连接,但是文件传输有时会失败。
而且这个服务器不可以匿名登陆所以当客户端匿名登陆时无法与服务器连接,只有用有效的用户名才可以与服务器建立连接。
7.总结
由于本软件实现功能较少,仅仅实现了文件的上传和下载。
如有需要可在本软件的基础之上进行改造和拓展。
如确实需要改造或拓展,请在VC++6.0、WindowsXP环境下进行,否则有可能出现最不愿看到的结果。
在这次简单的FTP客户端设计中,我通过各种渠道从各个方面查找资料,参考大量编程方面的书籍,掌握了vc++编程的基本知识,扩充了软件开发方面的知识,熟悉了vc++编程中一些控件的基本使用方法,通过这次设计锻炼了我编程方面的能力。
通过对Ftp这种大型的设计,我深感我们平时的编程习惯与良好的编程习惯相差甚远,所以我决定在以后的编程过程中养成良好的编程习惯,这样有助于自己所编的程序清晰明了便于在调试程序时发现错误改正错误,最重要是简短精炼的程序代码段有助于提高程序的执行效率,加快执行速度。
同时通过这次课程设计我形成了一种良好的学习习惯,懂得严格监督自己做好每一件事,有困难时要积极通过从各方面查找资料来解决或者及时寻求同学和老师的帮助,这样才能不断丰富自己的知识。
本次系统客户端的设计虽然基本获得圆满成功,但还是存在许多有待完善之处,例如:
只实现了单个文件的下载、操作方式不够灵活。
有几个方面的原因:
第一,由于时间比较匆促,以前学习网络编程时基础打得不是很好,所以做出来软件难免存在一些问题;其二,软件开发是一个需要长时间积累经验的工作,在
短期内很难有大突破性的进长,我相信通过我不断的学习,在不久的将来一定能把这些问题完善!