网络编程FTP客户端程序 (VC—MFC)

  • 格式:doc
  • 大小:136.00 KB
  • 文档页数:28

《网络程序设计》 课 程 设 计 报 告 书

题 目: 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(LPCTSTR pstrAgent=NULL,DWORD dwContext=1,DWORD dwAccessType=INTERNET_OPEN_TYPE_PRECONFIG, LPCTSTR pstrProxyName=NULL,,LPCTSTR pstrProxyBypass=NULL,DWORD dwFlags=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(LPCTSTR pstrServer,LPCTSTR pstrUserName=NULL,LPCTSTR pstrPassword=NULL, INTERNET_PORTnPort=INTERNET_INVALID_PORT_NUMBER, BOOL bPassive=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服务器上下载文件。 该函数原型为: BOOL GetFile(LPCTSTR pstrRemoteFile,LPCTSTR pstrLocalFile,BOOL bFailIfExists=TRUE,DWORD dwAttributes=FILE_ATTRIBUTE_NORMAL,DWORD dwFlags=FTP_TRANSFER_TYPE_BINARY,DWORD dwContext=1);

参数含义: pstrRemoteFile:指向要从服务器上下载的文件名的指针。 pstrLocalFile:指向下载的文件在本机上保存的名称的指针。 bFailIfExists:布尔型。当本机已存在pstrLocalFile指向的文件时,是否替换本机的文件。 dwAttributes:指定文件属性。 dwFlags:文件如何传送,默认值为FTP_TRANSFER_TYPE_BINARY,以二进制方式传送。 dwContext:上下文标识符。

2.界面设计: (1)用Visual C++ 6.0创建基于对话框的应用程序,添加五个Edit Box控件(分别用于存储FTP服务器的IP地址、用户名、密码、端口号和FTP服务器当前目录),再添加一个List Control控件(显示当前目录内容)和一些按钮等。 (2)依次添加与上述控件对应的变量: Cstring m_HostEdit; //FTP服务器IP地址 CString m_UserEdit; //用户名 CString m_PasswordEdit; //密码 int m_port; //端口号 Cstring m_DirName; //FTP服务器当前目录 ClistCtrl m_FileList; //显示当前目录内容 (3)添加其他变量: CinternetSession *m_pInetSession;//管理Internet连接 CftpConnection *m_pFtpConnection;//管理FTP连接 …….//其他变量

3.界面操作: (1)程序执行时的界面:客户端通过登录可实现与FTP服务器的连接,查看目录及文件。点击对话框上的按钮就能执行相应的操作。 (2)当建立连接后,查看目录下的文件列表时,双击文件名便可执行下载功能。 (3) 可在已连接的FTP服务器上创建文件目录

(4)可传送本地文件到FTP服务器端,在服务端打开目录或创建目录,再向目录里上传文件(输入要上传的本地文件名,输入文件在服务器目录里的文件名)。

四.系统详细设计 void CMyFtpDlg::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 = new CInternetSession(); //建立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); //连接已经建立,允许点击断开按钮