FTP客户端.docx
《FTP客户端.docx》由会员分享,可在线阅读,更多相关《FTP客户端.docx(13页珍藏版)》请在冰豆网上搜索。
FTP客户端
一、需求分析------------------------------------------2
1、功能需求
2、开发环境与工具
3、所需要知识
二、知识理解-----------------------------------------2
1、FTP实现的基本原理
(1)概要
(2)上传和下载
(3)用户FTP和匿名FTP
(4)ASCII和Binary
(5)Port和Passive
2、WinInet的中FTP的基本操作
(1)头文件
(2)打开连接和关闭
(3)CFtpConnection的操作函数
三、完成进度-----------------------------------------5
1、已完成部分
2、未完成部分
3、还需改善的部分
四、模块化设计---------------------------------------6
五、详细设计-----------------------------------------7
1、CFtpDlg类的一些函数定义………………………………………………7
2、CFtpOperate的一些函数定义……………………………………………22
六、测试结果----------------------------------------36
七、用户手册----------------------------------------40
八、实验总结----------------------------------------41
九、附录--------------------------------------------41
FTP客户端程序
一、需求分析
1、功能需求
(1)实现一个图形用户界面的FTP客户端,保证文件的安全传输和存储。
(2)提供登录界面,上传下载界面、帮助界面、关于界面。
(3)通过输入服务器地址、用户名和密码,可以实现远程FTP主机的登录。
(4)提供本地文件和文件夹的上传功能,可对FTP主机文件进行下载和删除文件。
(5)提供对本地目录的读取与返回,能正确列出文件和文件夹,在没有登录服务器前可以作为一个简单的文件查询工具对本地文件进行查询。
(6)帮助页面可以对用户提供使用说明。
(7)要求开发出的FTP客户端符合标准FTP协议规范,支持ASCII传输模式和二进制数据传输模式
(8)FTP的两种工作模式的选择Port模式(主动)和Passive模式(被动)
2、开发环境与工具
(1)使用的编程工具:
VC++
(2)使用的语言:
C++
(3)使用的开发包:
使用MFC和WinInet
(4)开发平台:
Windows7
3、所需要知识
(1)计算机网络的基本知识
(2)了解FTP基本实现原理
(3)使用VC++进行MFC程序开发的基本知识
(4)熟悉WinInet中属于FTP部分的操作
(5)熟悉文件或文件夹操作
(6)熟悉控件的操作,如在ListCtrol添加图片(浏览文件或文夹的图标)
二、知识理解
1、FTP实现的基本原理
(1)概要
Internet是一个非常复杂的计算机环境,Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。
基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。
FTP也是一个客户端/服务器系统。
用户通过一个支持FTP协议的客户端程序,连接到在远程主机上的FTP服务器程序。
用户通过客户端程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户端。
使用FTP时必须首先登录,在远程主机上获得相应的权限以后,方可下载或上传文件。
(2)上传和下载
"下载"文件就是从远程主机拷贝文件至自己的计算机上;
"上传"文件就是将文件从自己的计算机中拷贝至远程主机上
(3)用户FTP和匿名FTP
用户FTP:
种方式为已在FTP服务器上建立了特定帐号的用户使用,需要合法的用户名和密码才能登录到远程计算机传输文件。
匿名FTP:
用户作为“anonymous”登录到FTP服务器,不需要有自己的用户名和密码。
(4)ASCII和Binary
ASCII:
文本传输器使用ASCII字符,并由回车键和换行符分开
Binary:
二进制不用转换或格式化就可传字符,二进制模式比文本模式更快,并且可以传输所有ASCII值,所以系统管理员一般将FTP设置成二进制模式。
(5)Port和Passive
Port模式(主动):
FTP客户端首先和FTP服务器的TCP21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。
PORT命令包含了客户端用什么端口接收数据。
在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。
FTPserver必须和客户端建立一个新的连接用来传送数据。
Passive模式(被动):
Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。
FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTPserver不再需要建立一个新的和客户端之间的连接。
2、WinInet的中FTP的基本操作
(1)头文件:
#include<>
(2)打开连接和关闭:
必须先创建一个CInternetSession实例,然后创建CFtpConnection对象。
创建CFtpConnection对象不采用直接方式,而是调用CInternetSession:
:
GetFtpConnertion来创建并返回一个指向它的指针。
<示例>
CInternetSession*pInternetSession;
CFtpConnection*pFtpConnection;
pInternetSession=newCInternetSession(………);
pFtpConnection=pInternetSession->GetFtpConnection(………);
."menuitemtosystemmenu.
ASSERT((IDM_ABOUTBOX&0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX<0xF000);
CMenu*pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu!
=NULL)
{
CStringstrAboutMenu;
(IDS_ABOUTBOX);
if(!
())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strAboutMenu);
}
}
Theframeworkdoesthisautomatically
ForMFCapplicationsusingthedocument/viewmodel,
voidCFtpDlg:
:
OnPaint()
{
if(IsIconic())
{
CPaintDCdc(this);HCURSORCFtpDlg:
:
OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
0列的内容(下标从0开始)
CStringFirstColumn=(index,0);
CStringSecondColumn=(index,1);
if(index==0)0列的内容(下标从0开始)
CStringFirstColumn=(index,0);
CStringSecondColumn=(index,1);
CStringArrayServName;
intnFileNumber=0;
if(index==0).上层目录");
char*lpPath=(LPSTR)(LPCTSTR)m_strLocPath;
charszFind[300];
WIN32_FIND_DATAFindFileData;
strcpy(szFind,lpPath);
strcat(szFind,"*.*");
HANDLEhFind=:
:
FindFirstFile(szFind,&FindFileData);
&&str!
="..")
{
0列的内容(下标从0开始)
CStringFirstColumn=(index,0);
CStringSecondColumn=(index,1);
if(SecondColumn=="文件夹")
{
CTimeCurrentTime=CTime:
:
GetCurrentTime();
CStringstrTime;
("%d/%d/%d%d:
%d:
%d",(),(),
(),(),(),
());
strTime+="暂不支持上传文件夹!
\r\n";
intnLength=(WM_GETTEXTLENGTH);
(nLength,nLength);
(strTime);
return;
}
elseif(SecondColumn=="文件")
{
0列的内容(下标从0开始)
CStringFirstColumn=(index,0);
CStringSecondColumn=(index,1);
if(SecondColumn=="文件夹")
{
CTimeCurrentTime=CTime:
:
GetCurrentTime();
CStringstrTime;
("%d/%d/%d%d:
%d:
%d",(),(),
(),(),(),
());
strTime+="暂不支持下载文件夹!
\r\n";
intnLength=(WM_GETTEXTLENGTH);
(nLength,nLength);
(strTime);
return;
}
elseif(SecondColumn=="文件")
{
0列的内容(下标从0开始)
CStringFirstColumn=(index,0);
CStringSecondColumn=(index,1);
if(SecondColumn=="文件夹")
{
if()==2)
{
.上层目录");
for(inttest=0;test{
CStringstTemp=(test);
if(5)=="
")
{
......\r\n";
nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);
pEdiMes->SetSel(nLength,nLength);
pEdiMes->ReplaceSel(strTime);
.)
{
return0;
}
if(pFtpConnection!
=NULL)
{
deletepFtpConnection;
}
CurrentTime=CTime:
:
GetCurrentTime();
("%d/%d/%d%d:
%d:
%d",(),(),
(),(),(),
());
strTime+="------------已关闭连接---------\r\n";
nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);
pEdiMes->SetSel(nLength,nLength);
pEdiMes->ReplaceSel(strTime);
flag=1;.....\r\n";
nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);
pEdiMes->SetSel(nLength,nLength);
pEdiMes->ReplaceSel(strTime);
pFtpConnection->SetCurrentDirectory(m_strFullPath);
if(bBinary1==1)
{
returnnFileNumber;
}
.....\r\n";
}
else
{
strTime+="删除文件,请稍候:
"+remote+".......\r\n";
}
nLength=pEdiMes->SendMessage(WM_GETTEXTLENGTH);
pEdiMes->SetSel(nLength,nLength);
pEdiMes->ReplaceSel(strTime);
pFtpConnection->SetCurrentDirectory(m_strFullPath);
p3上传到服务器右边的路径,注意不同的服务器在不同区会有不同的限制
上传该文件花了6秒(文件大小,此次传送速度约为s),
完成后立即更新右边服务器端的文件显示
在同样的网络环境下使用商业化的软件FlashFXP上传该文件,耗时为
(3)下载测试
准备将右边的大明王朝文件下载到左边的本地路径中
下载该文件耗时为344秒,该文件大小为141Mb,此次下载速度约为s,下载完成后立即在左边更新并显示出来,下载到的文件可正常打开
在同样的网络环境下使用商业化的软件FlashFXP同样下载该文件,耗时为340s
(4)其它测试
由于手上只有广东工业大学的FTP服务器地址、用户名和密码,可能这服务器不把删除权限开放给这个用户名,所以不能完成删除服务器端文件或文件夹的测试。
其它方面如匿名登陆等均可正常工作,但在被动模式下不能登陆该服务器。
七、用户手册
(1)运行程序,根据需要进行功能选择
(2)关于和帮助信息
八、实验总结
本次课程设计完成了FTP客户端程序的设计,具有上传、下载、连接方式选择、传输方式选择、文件列表显示并及时更新等基本功能。
共花费了两天左右的时间,由于一些相关的FTP操作函数已经封装好了,本次课程设计并不是很难,只要理解并能运用WinInet内封装好的类函数就能完成基本的功能设计,本次课程设计的难点是在如何把这些组织起来并实现。
现在的一个缺憾是没有使用多线程下载,由于刚动手写的时候没有使用多线程,现在时间并不多了所以就不再进行修改了,而文件夹上传、文件夹下载也不在添加,否则会在操作时使界面陷入太久的停顿不响应。
在设计过程中也遇到一些问题,如怎样在列表控件中加入图片、如何获取本地磁盘盘符、文件等,特别是在查找服务器文件时使用了文件指针后忘记关闭,因为此耗费了一整个下午的时间才发现,所以细心和熟练的调试技巧是减少开发时间的重要手段。
另外个人感觉这一次FTP客户端程序的设计并不能太体现出在计算机网络上所学到的知识,这些连接建立、数据传输、连接端开等都已经被封装好了,如果是用底层来写这FTP客户端程序,自己控制一切的与服务器端的交互行为会能学到和深入理解更多的知识。
九、附录
参考文献:
[1]谢希仁,《计算机网络(第五版)》,电子工业出版社
[2]汪翔、袁辉,《VisualC++实践与提高网络编程篇》,中国铁道出版社
[3]博嘉科技,《VisualC++网络编程实作教程》,北京希望电子出版社