




已阅读5页,还剩23页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
一设计题目: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; /默认密码为anonymousif (m_port=0) m_port=21; /默认端口为21TRACE(:%s:%s:%s:%sn, m_HostEdit, m_UserEdit, m_PasswordEdit);trym_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);/连接已经建立,允许点击断开按钮catch(CInternetException *pEx)/错误处理TCHAR szError1024;if(pEx-GetErrorMessage(szError,1024)AfxMessageBox(szError);else AfxMessageBox(发生错误.);pEx-Delete();m_pFtpConnection = NULL;m_pInetSession = NULL; GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);void CMyFtpDlg:OnSend() /上传文件CString strSrc,strDst;CUpDlg dlg;if (!m_pFtpConnection) MessageBox(还没有连接到FTP服务器。);return;dlg.DoModal();strSrc=dlg.GetSrcFile();strDst=dlg.GetDstFile();if (!m_pFtpConnection-PutFile(strSrc,strDst) CString errStr;DWORD dw = GetLastError(); errStr.Format(上传文件失败.Error Code: %u,dw);MessageBox(errStr); elseMessageBox(上传文件成功!);return; void CMyFtpDlg:OnDisconnect() /断开连接GetDlgItem(IDC_DISCONNECT)-EnableWindow(FALSE);if (m_pFtpConnection!=NULL) /断开FTP服务器的连接m_pFtpConnection-Close();delete m_pFtpConnection; m_pFtpConnection=NULL;if (m_pInetSession!=NULL) /断开Internet连接m_pInetSession-Close();delete m_pInetSession; m_pInetSession=NULL;bConnect=FALSE;GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);void CMyFtpDlg:OnCreatedir() /创建目录 CString steDir;CCrtDirDlg dlg;if (!m_pFtpConnection) MessageBox(还没有连接到FTP服务器。);return;dlg.DoModal();steDir=dlg.GetDirName();if (!m_pFtpConnection-CreateDirectory(m_DirName)CString errStr;DWORD dw = GetLastError(); errStr.Format(创建目录失败.Error Code: %u,dw);MessageBox(errStr); elseMessageBox(创建目录成功!);return;void CMyFtpDlg:OnCurdir() /返回当前目录if (m_pFtpConnection) if (!m_pFtpConnection-GetCurrentDirectory(m_DirName)MessageBox(获取目录失败.); elseUpdateData(FALSE); /在编辑框中显示当前目录 elseMessageBox(还没有连接到FTP服务器。);void CMyFtpDlg: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(); elseMessageBox(还没有连接到FTP服务器。);void CMyFtpDlg:List() /文件列表 CString strName, strLen, strType,strTime; CString strAttr,strAttr1,strAttr2,strAttr3,strAttr4; FILETIME ftWrite; DWORD dwLen; BOOL bWorking=TRUE; int nItem;char strDir120; DWORD dSize=120;CFtpFileFind finder(m_pFtpConnection);m_pFtpConnection-GetCurrentDirectory(strDir,&dSize);m_DirName.Format(%s,strDir);trybWorking=finder.FindFile(_T(*);while (bWorking)bWorking = finder.FindNextFile();strName=finder.GetFileName();/名称if (!(finder.GetLastWriteTime(&ftWrite) strTime=;/更改时间else strTime=GetTimeStr(ftWrite);if (finder.IsDirectory() strType=文件夹;/类型else strType=文件;/大小.begindwLen=finder.GetLength();if (dwLen1024L) strLen.Format(%ldBytes,dwLen);else dwLen/=1024L;if (dwLenGetErrorMessage(sz, 1024);printf(ERROR! %sn, sz);pEx-Delete();UpdateData(FALSE);finder.Close();return;CString CMyFtpDlg:GetTimeStr(FILETIME ftWrite) /获取时间值 FILETIME ftLocal;CString strRet;CString strTmp;int iLen;SYSTEMTIME sysTime;/ 将最近的写入时间值转换为本地时间 if (!FileTimeToLocalFileTime(&ftWrite, &ftLocal)strRet=;return strRet;/ 将本地文件的时间值从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; return strRet;void CMyFtpDlg:OnDblclkList(NMHDR* pNMHDR, LRESULT* pResult) /用户双击List Contral控件 if (!bConnect) /如果连接已经断开,重新连接 bFirstConnect=FALSE;OnConnect();POSITION pos;CString strName,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;/如果是文件夹,就将该文件夹设为当前目录strName = m_FileList.GetItemText(IndexInFieldList, 0);OnCurdir();/得到当前目录m_DirNameint strLen=m_DirName.GetLength();if (m_DirName.GetAt(strLen-1)=/)m_DirName=m_DirName+strName;else m_DirName=m_DirName+/+strName;/将双击的文件夹设为当前目录UpdateData(FALSE);/更新显示 OnChangdir();/设置服务器的当前目录*pResult = 0;void CMyFtpDlg:OnFatherdir() int iLastFlash;if (!bConnect) bFirstConnect=FALSE;OnConnect();if (m_DirName=/) return;iLastFlash=m_DirName.ReverseFind(/);if (iLastFlash=0) m_DirName=/;else m_DirName=m_DirName.Left(iLastFlash);UpdateData(FALSE); OnChangdir();HWND CMyFtpDlg:CreateTipDlg() CTipDlg* pDialog;HWND hWndRet;/在CMyWnd类的构造函数中将pDialog初始化为NULL pDialog = new CTipDlg();/ 检查是否创建指针成功,得到一个有效的指向对话框对象的指针,if(pDialog != NULL)BOOL ret = pDialog-Create(IDD_TIP_DIALOG,this);if(!ret) /创建失败.AfxMessageBox(Error creating Tip Dialog);elsepDialog-ShowWindow(SW_SHOW);/ Sleep(50000);hWndRet=pDialog-m_hWnd;elseAfxMessageBox(Error Creating Tip Dialog Object);return hWndRet;void CMyFtpDlg:DownLoadFile(CString strFileName) /下载文件/下载strFileName文件,用户在List Control控件双击文件名时调用 HWND hTipWnd;hTipWnd=CreateTipDlg();/创建一个文件下载提示对话框if (m_pFtpConnection) /建立了FTP连接if (!m_pFtpConnection-GetFile(strFileName,c: + strFileName)/下载失败:SendMessage(hTipWnd,WM_MY_EXIT,1,0);/文件下载提示对话框中提示下载失败 else/下载完成 :SendMessage(hTipWnd,WM_MY_EXIT,0,0);/文件下载提示对话框中提示下载完成 else/没有建立FTP连接MessageBox(还没有连接到FTP服务器。);void CMyFtpDlg:OnDel() /删除 POSITION pos;CString strName,strType;pos = m_FileList.GetFirstSelectedItemPosition();IndexInFieldList = m_FileList.GetNextSelectedItem(pos);/ 得到项目索引strName = m_FileList.GetItemText(IndexInFieldList, 0);/名称strType=m_FileList.GetItemText(IndexInFieldList, 2);/类型if (strType=文件) Deletefile(strName);else Deletedir(strName);void CMyFtpDlg:Deletefile(CString strFileToDel) /删除文件UpdateData();if (m_pFtpConnection) if (!m_pFtpConnection-Remove(strFileToDel)CString errStr;DWORD dw = GetLastError(); errStr.Format(删除文件失败.Error Code: %u,dw);MessageBox(errStr); elseMessageBox(删除文件成功!); elseMessageBox(还没有连接到FTP服务器。);void CMyFtpDlg:Deletedir(CString strDirToDel) /删除目录UpdateData();if (m_pFtpConnection) if (!m_pFtpConnection-RemoveDirectory(strDirToDel)CString errStr;DWORD dw = GetLastError(); errStr.Format(删除目录失败.Error Code: %u,dw);MessageBox(errStr); elseMessageBox(删除目录成功!); elseMessageBox(还没有连接到FTP服务器。);四课程设计总结本次课程设计主要实现了基本的FTP客户端功能,能登陆FTP服务器,显示登陆客户目录下的文件和目录名,能从该目录中选择下载服务器的文件,也能向服务器上传文件。 通过本次课程设计,进一步理解了C+语言和网络编程技术,基本掌握了VC+应用程序设计;掌握了网络编程应用程序分析、设计、编程和调试的整个过程。提高了网络应用与编程、分析与解决实际问题的能力,为工作中网络编程打下了基础。指导教师评语:成绩: 指导教师: 年 月 日附录源代码 :/CrtDirDlg.h#if !defined(AFX_CRTDIRDLG_H_2DE1DA5F_070C_4DEE_AAB8_759EF90C6B24_INCLUDED_)#define AFX_CRTDIRDLG_H_2DE1DA5F_070C_4DEE_AAB8_759EF90C6B24_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000/ CrtDirDlg.h : header file/ CCrtDirDlg dialogclass CCrtDirDlg : public CDialog/ Constructionpublic:CString GetDirName();CCrtDirDlg(CWnd* pParent = NULL); / standard constructor/ Dialog Data/AFX_DATA(CCrtDirDlg)enum IDD = IDD_CRTDIR_DIALOG;CStringm_DirToCrt;/AFX_DATA/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CCrtDirDlg)protected:virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:/ Generated message map functions/AFX_MSG(CCrtDirDlg)/ NOTE: the ClassWizard will add member functions here/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_CRTDIRDLG_H_2DE1DA5F_070C_4DEE_AAB8_759EF90C6B24_INCLUDED_)/ MyFtp.h : main header file for the MYFTP application/#if !defined(AFX_MYFTP_H_EBAAEC27_5A1D_440C_82B1_385AE319A579_INCLUDED_)#define AFX_MYFTP_H_EBAAEC27_5A1D_440C_82B1_385AE319A579_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#ifndef _AFXWIN_H_#error include stdafx.h before including this file for PCH#endif#include resource.h/ main symbols/ CMyFtpApp:/ See MyFtp.cpp for the implementation of this class/class CMyFtpApp : public CWinApppublic:CMyFtpApp();/ Overrides/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMyFtpApp)public:virtual BOOL InitInstance();/AFX_VIRTUAL/ Implementation/AFX_MSG(CMyFtpApp)/ NOTE - the ClassWizard will add and remove member functions here./ DO NOT EDIT what you see in these blocks of generated code !/AFX_MSGDECLARE_MESSAGE_MAP();/AFX_INSERT_LOCATION/ Microsoft Visual C+ will insert additional declarations immediately before the previous line.#endif / !defined(AFX_MYFTP_H_EBAAEC27_5A1D_440C_82B1_385AE319A579_INCLUDED_)/ MyFtpDlg.h : header file/#if !defined(AFX_MYFTPDLG_H_91E34BFF_2935_4334_BEE8_49C34942A679_INCLUDED_)#define AFX_MYFTPDLG_H_91E34BFF_2935_4334_BEE8_49C34942A679_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000#include / CMyFtpDlg dialogclass CMyFtpDlg : public CDialog/ Constructionpublic:CMyFtpDlg(CWnd* pParent = NULL);/ standard constructor CMyFtpDlg();/ Dialog Data/AFX_DATA(CMyFtpDlg)enum IDD = IDD_MYFTP_DIALOG ;CListCtrlm_FileList;CStringm_HostEdit;CStringm_PasswordEdit;CStringm_UserEdit;intm_port;CStringm_DirName;/AFX_DATA/ ClassWizard generated virtual function overrides/AFX_VIRTUAL(CMyFtpDlg)protected:virtual void DoDataExchange(CDataExchange* pDX);/ DDX/DDV support/AFX_VIRTUAL/ Implementationprotected:HWND CreateTipDlg();void OnCurdir(); void OnChangdir();CString GetTimeStr(FILETIME ftWrite);void List();int IndexInFieldList;/存储m_FileList的项目索引int iItemCount;CInternetSession *m_pInetSession;CFtpConnection *m_pFtpConnection;BOOL bConnect;BOOL bFirstConnect; CString strDirTmp;HICON m_hIcon; / Generated message map functions/AFX_MSG(CMyFtpDlg)virtual BOOL OnInitDialog();afx_msg void OnSysCommand(UINT nID, LPARAM lParam);afx_msg void OnPaint();afx_msg HCURSOR OnQueryDragIcon();afx_msg void OnConnect();afx_msg void OnSend();afx_msg void OnDisconnect();afx_msg void OnCreatedir
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一庆祝活动方案
- 六一活动加营销活动方案
- 六一活动童装店活动方案
- 六一活动送课活动方案
- 六一烹饪活动策划方案
- 六一社区篮球活动方案
- 六一童话世界活动方案
- 六一自助活动方案
- 六一黏土活动方案
- 六年级写班级活动方案
- GB/T 14518-1993胶粘剂的pH值测定
- 数字电路设计及verilog-hdl实现康磊课后答案
- GA/T 974.33-2011消防信息代码第33部分:起火原因分类与代码
- GA 44-2015消防头盔
- 《科学护眼爱眼共享光明未来》近视防控宣传教育课件
- 面向对象分析和设计讲座面向对象方法学PPT资料
- 铸铁闸门及启闭机安装说明及操作手册
- 《财政学》教学大纲中文版
- 高危新生儿急诊服务流程图
- “文化引导型”城市更新思想思考与实践课件
- 卷心菜中过氧化物酶热稳定性的初步研究
评论
0/150
提交评论