网络编程FTP客户端程序 VCMFC.docx
- 文档编号:10501541
- 上传时间:2023-02-14
- 格式:DOCX
- 页数:44
- 大小:49.77KB
网络编程FTP客户端程序 VCMFC.docx
《网络编程FTP客户端程序 VCMFC.docx》由会员分享,可在线阅读,更多相关《网络编程FTP客户端程序 VCMFC.docx(44页珍藏版)》请在冰豆网上搜索。
网络编程FTP客户端程序VCMFC
《网络程序设计》
课程设计报告书
题目:
FTP客户端程序
专业:
网络工程
学号:
20091415
完成日期:
2012-6-7
一.设计题目:
FTP客户端程序
二.设计要求:
程序能实现基本FTP客户端功能,能登陆FTP服务器,显示登陆客户目录下的文件和目录名,能从该目录中选择下载服务器的文件,也能向服务器上传文件。
1.该程序是基于对话框的MFC程序,程序界面布置要点:
1)三个文本编辑框,分别用于输入FTP服务器域名、登陆用户名和登陆口令。
2).一个列表框,用来显示FTP服务器当前目录的内容,并允许客户从中选择文件下载。
3).四个命令按钮分别执行查询、上传、下载和退出的功能。
2.用户执行程序的流程是:
1)进行各种操作之前,应首先输入服务器域名、登陆用户名和口令。
如果要进行查询,可以点击“查询”按钮,调用OnQuery函数。
该函数获得用户当前输入的服务器名、登陆用户名和口令等信息,清除列表框的内容;然后创建Internet会话类对象,进行服务器的登陆,试图建立与指定FTP服务器的连接;如果连接成功,就创建ftpFileFind文件检索类对象,查找服务器上当前目录的任意文件,找到了第一个文件后,继续找其他的文件,并将找到的文件或目录名显示在列表框中。
所有文件找到后,结束查询,并依次删除文件查询对象、FTP连接对象和Internet会话对象,结束会话。
2)此时,可以从服务器下载文件。
从列表框中选择一个文件,会产生LBN_SELCHANGE事件,自动调用相应的OnSelchangeListFile函数,禁用用来输入的文本框控件,禁用查询和上传按钮,激活下载按钮。
此时,用户可以点击“下载”按钮,产生BN_CLICKED事件,自动调用OnDownLoad函数,调用DownLoad函数,下载该文件。
下载完毕,禁用下载按钮,激活查询和上传按钮,激活用来输入的文本框控件。
而DownLoad函数重新创建Internet会话,建立FTP连接,下载文件后,将会话对象和连接对象清除。
3)如果要向FTP服务器上传文件,点击“上传”按钮,产生BN_CLICKED事件,调用OnUpLoad函数,该函数获得当前输入的服务器名、登陆用户名和口令,禁用用于输入的文本框控件,禁用查询按钮,禁用用于输入的文本框控件,弹出小对话框,获得待上传的本地机文件路径和文件名,调用UpLoad函数上传文件。
上传完毕,激活查询按钮,激活用于输入的文本和编辑控件。
UpLoad函数也重新创建Internet会话,建立FTP连接,上传文件后,然后清除会话对象和连接对象。
可见,此程序的查询、上传和下载功能基本是独立的。
每次都要创建会话、建立连接,执行操作,然后清除对象。
这时是为了简单清楚起见而这样做的。
3.此程序的主要技术要点是:
如何创建一个Internet会话,即创建CinternetSession对象;如何建立与FTP服务器的连接,即创建CftpConnection对象;如果连接成功,如何获得当前登陆的目录下的文件和目录名称,即检索一个目录下的文件,并显示文件信息;如何下载文件、上传文件以及关闭连接。
三.系统概要设计
1.FTP使用函数介绍:
(1)CInternetSession:
:
CinternetSession()。
在创建CinternetSession对象时调用这个函数,这是应用程序第一个要调用的Internet函数,他初始化内部数据结构。
该函数原型为:
CInternetSession:
:
CinternetSession(LPCTSTRpstrAgent=NULL,DWORD
dwContext=1,DWORDdwAccessType=INTERNET_OPEN_TYPE_PRECONFIG,
LPCTSTRpstrProxyName=NULL,,LPCTSTRpstrProxyBypass=NULL,DWORDdwFlags=0);
参数含义:
PstrAgent:
指向应用程序名字的指针,默认值为NULL,此时MFC调用全局函数AfxGetAppName取得应用程序的名字。
DwContext:
上下文标识符,默认为1,也可以明确的指明一个ID,这样CinternetSession对象和所有操作都和该ID发生联系。
DwAccessType:
访问类型,默认值为INTERNET_OPEN_TYPE_PRECONFIG,表示在注册表中预先设置的访问类型。
PstrProxyName:
首选代理服务器的名字,如果DwAccessType设为如上默认值,则该参数默认值为NULL。
PstrProxyBypass:
指向服务器可选地址表的指针,默认值为NULL,表示从注册表中读取。
DwFlags:
只是缓存和异步的标志,默认值为0。
(2)CInternetSession:
:
GetFtpConnection()。
调用这个函数建立一个FTP连接,并获得一个指向CftpConnection对象的指针。
该函数原型为:
CftpConnection*GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName=NULL,LPCTSTRpstrPassword=NULL,
INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER,
BOOLbPassive=FALSE);
参数含义:
pstrServer:
指向FTP服务器名字的指针。
pstrUserName:
指向用户名的指针,默认值为NULL,表示用户名anonymous。
pstrPassword:
指向密码的指针,默认值为NULL。
如果PstrUserName与PstrPassword都为NULL,则密码为anonymous。
如果PstrPassword为NULL,而PstrUserName不为NULL,则密码为空。
nPort:
服务器上那个的TCP/IP端口号,一般为21。
bPassive:
是否为被动方式。
默认值为FALSE,表示客户端以主动方式与服务器建立连接
(3)CftpConnection:
:
GetFile()。
调用这个函数,可以从FTP服务器上下载文件。
该函数原型为:
BOOLGetFile(LPCTSTRpstrRemoteFile,LPCTSTRpstrLocalFile,BOOLbFailIfExists=TRUE,DWORDdwAttributes=FILE_ATTRIBUTE_NORMAL,DWORDdwFlags=FTP_TRANSFER_TYPE_BINARY,DWORDdwContext=1);
参数含义:
pstrRemoteFile:
指向要从服务器上下载的文件名的指针。
pstrLocalFile:
指向下载的文件在本机上保存的名称的指针。
bFailIfExists:
布尔型。
当本机已存在pstrLocalFile指向的文件时,是否替换本机的文件。
dwAttributes:
指定文件属性。
dwFlags:
文件如何传送,默认值为FTP_TRANSFER_TYPE_BINARY,以二进制方式传送。
dwContext:
上下文标识符。
2.界面设计:
(1)用VisualC++6.0创建基于对话框的应用程序,添加五个EditBox控件(分别用于存储FTP服务器的IP地址、用户名、密码、端口号和FTP服务器当前目录),再添加一个ListControl控件(显示当前目录内容)和一些按钮等。
(2)依次添加与上述控件对应的变量:
Cstringm_HostEdit;//FTP服务器IP地址
CStringm_UserEdit;//用户名
CStringm_PasswordEdit;//密码
intm_port;//端口号
Cstringm_DirName;//FTP服务器当前目录
ClistCtrlm_FileList;//显示当前目录内容
(3)添加其他变量:
CinternetSession*m_pInetSession;//管理Internet连接
CftpConnection*m_pFtpConnection;//管理FTP连接
…….//其他变量
3.界面操作:
(1)程序执行时的界面:
客户端通过登录可实现与FTP服务器的连接,查看目录及文件。
点击对话框上的按钮就能执行相应的操作。
(2)当建立连接后,查看目录下的文件列表时,双击文件名便可执行下载功能。
(3)可在已连接的FTP服务器上创建文件目录
(4)可传送本地文件到FTP服务器端,在服务端打开目录或创建目录,再向目录里上传文件(输入要上传的本地文件名,输入文件在服务器目录里的文件名)。
四.系统详细设计
voidCMyFtpDlg:
:
OnConnect()//用户点击连接、建立连接
{//初始化处理
UpdateData();
GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
m_HostEdit.TrimLeft();
m_HostEdit.TrimRight();
m_UserEdit.TrimLeft();
m_UserEdit.TrimRight();
m_PasswordEdit.TrimLeft();
m_PasswordEdit.TrimRight();
if(m_UserEdit=="")m_UserEdit="anonymous";//默认用户名为anonymous
if(m_PasswordEdit=="")m_PasswordEdit="anonymous";//默认密码为anonymous
if(m_port==0)m_port=21;//默认端口为21
TRACE(":
%s:
%s:
%s:
%s\n",m_HostEdit,m_UserEdit,m_PasswordEdit);
try
{
m_pInetSession=newCInternetSession();//建立Internet连接
m_pFtpConnection=m_pInetSession->GetFtpConnection(m_HostEdit,m_UserEdit,m_PasswordEdit,m_port);//建立FTP连接
if(bFirstConnect)List();//第一次连接时显示服务器目录文件及文件夹
bConnect=TRUE;
GetDlgItem(IDC_DISCONNECT)->EnableWindow(TRUE);
//连接已经建立,允许点击断开按钮
}
catch(CInternetException*pEx)//错误处理
{
TCHARszError[1024];
if(pEx->GetErrorMessage(szError,1024))
AfxMessageBox(szError);
elseAfxMessageBox("发生错误.");
pEx->Delete();
m_pFtpConnection=NULL;
m_pInetSession=NULL;
GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
}
}
voidCMyFtpDlg:
:
OnSend()//上传文件
{
CStringstrSrc,strDst;
CUpDlgdlg;
if(!
m_pFtpConnection)
{
MessageBox("还没有连接到FTP服务器。
");
return;
}
dlg.DoModal();
strSrc=dlg.GetSrcFile();
strDst=dlg.GetDstFile();
if(!
m_pFtpConnection->PutFile(strSrc,strDst))
{
CStringerrStr;
DWORDdw=GetLastError();
errStr.Format("上传文件失败.ErrorCode:
%u",dw);
MessageBox(errStr);
}
else
{
MessageBox("上传文件成功!
");
}
return;
}
voidCMyFtpDlg:
:
OnDisconnect()//断开连接
{
GetDlgItem(IDC_DISCONNECT)->EnableWindow(FALSE);
if(m_pFtpConnection!
=NULL)//断开FTP服务器的连接
{m_pFtpConnection->Close();
deletem_pFtpConnection;
m_pFtpConnection=NULL;
}
if(m_pInetSession!
=NULL)//断开Internet连接
{m_pInetSession->Close();
deletem_pInetSession;
m_pInetSession=NULL;
}
bConnect=FALSE;
GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
}
voidCMyFtpDlg:
:
OnCreatedir()//创建目录
{
CStringsteDir;
CCrtDirDlgdlg;
if(!
m_pFtpConnection)
{
MessageBox("还没有连接到FTP服务器。
");
return;
}
dlg.DoModal();
steDir=dlg.GetDirName();
if(!
m_pFtpConnection->CreateDirectory(m_DirName))
{
CStringerrStr;
DWORDdw=GetLastError();
errStr.Format("创建目录失败.ErrorCode:
%u",dw);
MessageBox(errStr);
}
else
{
MessageBox("创建目录成功!
");
}
return;
}
voidCMyFtpDlg:
:
OnCurdir()//返回当前目录
{
if(m_pFtpConnection)
{
if(!
m_pFtpConnection->GetCurrentDirectory(m_DirName))
{
MessageBox("获取目录失败.");
}
else
{
UpdateData(FALSE);//在编辑框中显示当前目录
}
}
else
{
MessageBox("还没有连接到FTP服务器。
");
}
}
voidCMyFtpDlg:
:
OnChangdir()//改变目录
{
UpdateData();
m_DirName.TrimLeft();
m_DirName.TrimRight();
if(m_pFtpConnection)
{
if(!
m_pFtpConnection->SetCurrentDirectory(m_DirName))
{
MessageBox("改变目录失败.");
}
else
{
if(!
(m_FileList.DeleteAllItems()))
{MessageBox("改变目录失败.");return;}
elseList();
}
}
else
{
MessageBox("还没有连接到FTP服务器。
");
}
}
voidCMyFtpDlg:
:
List()//文件列表
{
CStringstrName,strLen,strType,strTime;
CStringstrAttr,strAttr1,strAttr2,strAttr3,strAttr4;
FILETIMEftWrite;
DWORDdwLen;
BOOLbWorking=TRUE;
intnItem;
charstrDir[120];
DWORDdSize=120;
CFtpFileFindfinder(m_pFtpConnection);
m_pFtpConnection->GetCurrentDirectory(strDir,&dSize);
m_DirName.Format("%s",strDir);
try
{
bWorking=finder.FindFile(_T("*"));
while(bWorking)
{
bWorking=finder.FindNextFile();
strName=finder.GetFileName();//名称
if(!
(finder.GetLastWriteTime(&ftWrite)))strTime="";//更改时间
elsestrTime=GetTimeStr(ftWrite);
if(finder.IsDirectory())strType="文件夹";//类型
elsestrType="文件";
//大小...begin
dwLen=finder.GetLength();
if(dwLen<1024L)strLen.Format("%ldBytes",dwLen);
else
{
dwLen/=1024L;
if(dwLen<1024L)strLen.Format("%ldKB",dwLen);
else
{dwLen/=1024L;
strLen.Format("%ldMB",dwLen);
}
//大小...end
//属性...begin
if(finder.IsDirectory())strAttr1="d";
elsestrAttr1="-";//是否目录
strAttr2="r";//是否可读
if(finder.IsReadOnly())strAttr3="-";//是否可写
elsestrAttr3="w";
strAttr4="x";//是否可执行
strAttr=strAttr1+strAttr2+strAttr3+strAttr4;
//属性...end
//往列表控件中添加项目...begin
nItem=m_FileList.InsertItem(iItemCount,strName);//名称
m_FileList.SetItemText(nItem,1,strLen);//大小
m_FileList.SetItemText(nItem,2,strType);//类型
m_FileList.SetItemText(nItem,3,strTime);//更改时间
m_FileList.SetItemText(nItem,4,strAttr);//属性
//往列表控件中添加项目...end
}
iItemCount++;
}
}
catch(CInternetException*pEx)
{
TCHARsz[1024];
pEx->GetErrorMessage(sz,1024);
printf("ERROR!
%s\n",sz);
pEx->Delete();
}
UpdateData(FALSE);
finder.Close();
return;
}
CStringCMyFtpDlg:
:
GetTimeStr(FILETIMEftWrite)//获取时间值
{
FILETIMEftLocal;
CStringstrRet;
CStringstrTmp;
intiLen;
SYSTEMTIMEsysTime;
//将最近的写入时间值转换为本地时间
if(!
FileTimeToLocalFileTime(&ftWrite,&ftLocal))
{strRet="";returnstrRet;}
//将本地文件的时间值从UTC转换为系统时间
FileTimeToSystemTime(&ftLocal,&sysTime);
strTmp.Format("%d-%d-%d",sysTime.wYear,sysTime.wMonth,
sysTime.wDay);
iLen=strTmp.GetLength();
if(iLen==9)strTmp.Insert(9,"");
if(iLen==10)strTmp.Insert(10,"");
strRet=strTmp;
strTmp.Format("%d:
%02d:
%02d",sysTime.wHour,
sysTime.wMinute,sysTime.wSecond);
strRet+=strTmp;
returnstrRet;
}
voidCMyFtpDlg:
:
OnDblclkList(NMHDR*pNMHDR,LRESULT*pResult)
{//用户双击ListContral控件
if(!
bConnect)//如果连接已经断开,重新连接
{
bFirstConnect=FALSE;
OnConnect();
}
POSITIONpos;
CStringstrName,strType;
pos=m_FileList.GetFirstSelectedItemPosition();
IndexInFieldList=m_FileList.GetNextSelectedItem(pos);//得到项目索引
strName=m_FileList.GetItemText(IndexInFieldList,0);//名称
strType=m_FileList.GetItemText(IndexInFieldList,2);//类型
if(strType=="文件")//如果双击的是文件,就下载该文件
{
DownLoadFile(strName);
return;
}
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 网络编程FTP客户端程序 VCMFC 网络 编程 FTP 客户端 程序