东南大学自动化学院实验报告课程名称:信息通信网络概论第2次实验实验名称:FTP客户端通信程序设计院(系):自动化专业:自动化姓名:徐丽娜学号:08011308实验室:实验组别:同组人员:实验时间:2013年12月9日评定成绩:审阅教师:1目录一.实验目的和要求……………………………………………………2二.实验原理……………………………………………………………2三.实验方案与实验步骤………………………………………………2四.实验设备与器材配置………………………………………………3五.实验记录……………………………………………………………3六.实验总结:……………………………………………………………7七.思考题或讨论题……………………………………………………72一、实验目的和要求:1.使用MFCWinInet函数编写一个简单的FTP客户端程序,实现FTP客户端软件的基本功能—检索FTP文件服务器,上传和下载。2.理解掌握CInternetSession、CFtpFileFind类及GetFtpConnection()、FindFile()、FindNextFile()、GetFile()、PutFile()函数的使用,并熟悉FTP的编程的过程。二、实验原理:在使用MFC编程时,要连接到FTP服务器是一件非常简单的事情,只需要两个简单的步骤,首先必须建立一个CinternetSession对象,用类CinternetSession创建并初始化一个或几个同时存在的Internet会话(Session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的廉洁,可以创建一个CinternetSession对象作为类CwinApp的成员。MFC中的类CftpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP时MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CinternetSession实例和一个CftpConnection对象就可以实现和一个FTP服务器通信,我们不需要直接创建CftpConnection对象,而是通过调用CinternetSession::GetFtpConnection来完成这项工作。他创建CFtpConnection对象并返回一个指向该对象的指针。在FTP连接的程序中,主要适用下列7个函数:⑴CInternetSession对象在创建CInternetSession对象时调用这个成员函数。CInternetSession是应用程序第一个要调用的Internet函数,它将初始化内部数据结构,以备将来在应用程序中调用。⑵GetFtpConnection()函数。调用这个函数建立FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。如果打算读写文件,必须进行分步操作。⑶GetFile()函数。调用这个成员函数,可以从FTP服务器区的文件,并且把文件储存到本地机器上。⑷PutFile()函数。调用这个成员函数把文件储存到FTP服务器上。它能够处理有关把文件存放到服务器上的所有工作。⑸FTP文件查找函数。调用这个成员函数构造一个CftpFileFind对象。⑹FindFile()函数。调用这个函数查找FTP文件,调用它检索到第一个FTP文件后,可以调用FindNextFile()检索后面的FTP文件。⑺FindNextFile()函数。调用这个函数继续查找文件,在调用任何属性以前,必须已经至少调用过一次此函数。以上函数的具体使用方法可以参见MSDN。三、实验方案与实验步骤:主要步骤:1.创建一个internet会话。CInternetSession*pSession;pSession=newCInternetSession(AfxGetAppName(),1,3PRE_CONFIG_INTERNET_ACCESS);2.建立与FTP服务器的连接。CFtpConnection*pConnection;pConnection=pSession-GetFtpConnection(m_strFtpSite,m_strName,m_strPwd);3、如果连接成功,获得当前登陆的缺省目录下所有的文件和目录名称。CFtpFileFind*pFileFind;pFileFind=newCFtpFileFind(pConnection);Find()4、下载文件或上传文件。OnDownload()OnUpload()5、关闭连接。四、实验设备与器材配置:1.实验室具有基于TCP/IP协议的Windows网络硬软件环境;2.微机1台。五、实验记录:1.连接:voidCFtpDlg::OnConnect(){CStringstrConnect;m_BtnConnect.GetWindowText(strConnect);pSession=NULL;pConnection=NULL;pFileFind=NULL;4UpdateData(TRUE);//获得当前输入if(m_strFtpSite.IsEmpty())//判断ftp地址栏是否为空{AfxMessageBox(请输入ftp服务器地址!);return;}while(m_ListFile.GetCount()!=0)//清除列表框内容m_ListFile.DeleteString(0);if(strConnect==连接){pSession=newCInternetSession(AfxGetAppName(),//创建Internet会话PRE_CONFIG_INTERNET_ACCESS);try{pConnection=pSession-GetFtpConnection(m_strFtpSite,//试图建立FTP连接m_strName,m_strPwd);}catch(CInternetException*e)//错误处理{e-Delete();pConnection=NULL;AfxMessageBox(连接错误,请检查地址和用户名密码);return;}if(pConnection!=NULL){//创建CFtpFileFind对象//传递CFtpConnection对象的指针pFileFind=newCFtpFileFind(pConnection);}if(Find()){m_BtnConnect.SetWindowText(断开连接);if(m_strName==){m_strName=_T(anonymous);m_strPwd=_T(anonymous);UpdateData(FALSE);}}elseAfxMessageBox(不能正确初始化!);}else{if(pConnection!=NULL){pConnection-Close();deletepConnection;}if(pFileFind!=NULL){pFileFind-Close();deletepFileFind;}deletepSession;m_BtnConnect.SetWindowText(连接);}}若连接出现错误,则会显示消息框“连接错误”2.上传若没有选择文件,则会出现消息框:“选择文件”若上传成功,则出现消息框:“上传成功”5同时还有上传失败的消息框。voidCFtpDlg::OnUpload(){UpdateData(TRUE);//获得当前输入m_EditFtp.EnableWindow(FALSE);//禁止用来输入的文本和编辑框控件m_EditName.EnableWindow(FALSE);m_EditPwd.EnableWindow(FALSE);m_StaFtp.EnableWindow(FALSE);m_StaName.EnableWindow(FALSE);m_StaPwd.EnableWindow(FALSE);m_BtnConnect.EnableWindow(FALSE);//禁止查询按钮CStringstrSourceName;CStringstrDestName;CFileDialogdlg(TRUE,,*.*);if(dlg.DoModal()==IDOK){strSourceName=dlg.GetPathName();//获得待上传得本地机文件的路径和名称strDestName=dlg.GetFileName();if(pConnection-PutFile(strSourceName,strDestName))//调用函数上传文件{AfxMessageBox(上传成功!,MB_OK|MB_ICONINFORMATION);while(m_ListFile.GetCount()!=0)m_ListFile.DeleteString(0);Find();}elseAfxMessageBox(上传失败!,MB_OK|MB_ICONSTOP);}else{AfxMessageBox(请选择文件!,MB_OK|MB_ICONSTOP);}//文件选择错误m_EditFtp.EnableWindow(TRUE);//激活用来输入的文本和编辑框控件m_EditName.EnableWindow(TRUE);m_EditPwd.EnableWindow(TRUE);m_StaFtp.EnableWindow(TRUE);m_StaName.EnableWindow(TRUE);m_StaPwd.EnableWindow(TRUE);m_BtnConnect.EnableWindow(TRUE);}//激活查询按钮3.下载6下载时也出现一系列对话框用来提示错误或非法操作。voidCFtpDlg::OnDownload(){UpdateData(TRUE);//获得当前输入intnSel=m_ListFile.GetCurSel();CStringstrSourceName;m_ListFile.GetText(nSel,strSourceName);//获得用户在列表框中的选择if(strSourceName.GetAt(0)!='[')//选择的是文件{CStringstrDestName;CFileDialogdlg(FALSE,,strSourceName);if(dlg.DoModal()==IDOK){strDestName=dlg.GetPathName();//获得下载文件在本地机上存储的路径和名称if(pConnection-GetFile(strSourceName,strDestName))//下载文件{AfxMessageBox(下载成功!,MB_OK|MB_ICONINFORMATION);m_BtnDownLoad.EnableWindow(FALSE);//禁用下载按钮}elseAfxMessageBox(下载失败!,MB_OK|MB_ICONSTOP);}else{if(strSourceName==)AfxMessageBox(请写入文件名!,MB_OK|MB_ICONSTOP);}}else{AfxMessageBox(不能下载目录!,MB_OK|MB_ICONSTOP);}//选择的是目录m_BtnUpLoad.EnableWindow(TRUE);//激活查询和上传按钮m_EditFtp.EnableWindow(TRUE);//激活用来输入的文本和编辑框控件m_EditName.EnableWindow(TRUE);m_EditPwd.EnableWindow(TRUE);m_StaFtp.EnableWindow(TRUE);m_StaName.EnableWindow(TRUE);m_StaPwd.EnableWindow(T