一.设计题目: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,DWORDdwContext=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;//默认用户名为anonymousif(m_PasswordEdit==)m_PasswordEdit=anonymous;//默认密码为anonymousif(m_port==0)m_port=21;//默认端口为21TRACE(:%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_pFtpConnec