FTP编程与资源访问.ppt

上传人:tia****nde 文档编号:12805822 上传时间:2020-05-25 格式:PPT 页数:70 大小:2.02MB
返回 下载 相关 举报
FTP编程与资源访问.ppt_第1页
第1页 / 共70页
FTP编程与资源访问.ppt_第2页
第2页 / 共70页
FTP编程与资源访问.ppt_第3页
第3页 / 共70页
点击查看更多>>
资源描述
第6章FTP编程与资源访问,FTP应用基础,制作FTP上传下载器,FTP服务器的实现,自制FTP客户端与服务器对接,6.1FTP应用基础,6.1.1FTP简介与大多数Internet应用一样,FTP也是基于客户端服务器(C/S)模式工作的,如图6.1所示。,6.1.2FTP的特性,1适应异构系统FTP可以使用的文件类型有以下四种。(1)ASCII码文件。这是FTP默认的文本文件格式,数据在传输过程中使用与Telnet相同的NVTASCII码。(2)EBCDIC码文件。它也是一种文本类型文件,只是利用8位代码表示一个字符,该文本文件在传输时要求两端都使用EBCDIC码。(3)图像(Image)文件。图像文件也称为二进制文件类型,发送的数据为连续的比特流,实际传输时,发送方将数据打包成为8位,然后以字节为单位进行传输。(4)本地(local)文件。字节的大小由本地主机定义,即每一字节的比特数由发送方规定,用于在具有不同字节大小的主机间传输二进制文件。,6.1.2FTP的特性,FTP支持的文件数据结构有如下几种结构。(1)文件结构。这是FTP默认的方式,文件被认为是一个连续的字节流,不存在内部的结构。(2)记录结构。只适用于文本文件(ASCII或EBCDIC),是由连续的记录构成的。(3)页结构。当文件是由非连续的多个部分组成时,使用页结构,这种文件称为随机访问文件。每页都带有页号发送,以便接收方能够随机地存储各页。,6.1.2FTP的特性,2匿名FTP通常,使用FTP时必须首先登录,输入用户名和密码,从远程主机获得相应的权限后,方可下载或上传文件。但这违背了Internet的开放性,匿名FTP就是为解决这个问题而产生的一种机制:用户可通过它连接到远程主机并下载文件,而无须成为其注册用户。系统管理员建立一个特殊的用户名anonymous,Internet上的任何人在任何地方都可使用该用户名。,6.1.3FTP工作原理,下面以客户要从FTP服务器上下载一个文件为例,说明FTP的完整工作过程。其工作原理如图6.2所示。,6.1.3FTP工作原理,1启动FTP用户通过GUI界面操作客户端软件,执行启动FTP的用户交互式命令。2建立控制连接客户端TCP层根据用户命令中给出的服务器IP地址,向服务器提供FTP服务的21端口发出主动建立连接的请求。服务器收到请求后,通过三次握手,在进行FTP命令处理的用户协议解释器进程和服务器协议解释器进程之间建立一条TCP连接,6.1.3FTP工作原理,3建立数据连接和进行文件传输(1)在客户端请求分配一个临时的TCP端口号。(2)在客户端由客户协议解释器通过控制连接,向服务器协议解释器发送两条命令:一条命令(使用PORT命令)是将客户端的IP地址和申请到的临时端口号这两个参数,告诉给服务器协议解释器;另一条命令是将服务器上某文件传输到客户端的服务请求。(3)服务器协议解释器收到客户端的IP地址和临时端口号后,以该IP地址和端口号为目标,使用服务器的20端口(TCP层用于传输数据的端口)向客户发出主动建立连接的请求。(4)客户收到请求后,通过三次握手,在客户数据传输进程和服务器数据传输进程之间建立一条TCP连接,下面的传输文件就通过这个连接进行,由于它的建立是专用于传输数据的,所以将它称为数据连接。(5)服务器的数据传输进程从它的文件系统中找到客户进程请求传输的文件。(6)服务器的数据传输进程通过数据连接将该文件发送到用户数据传输进程。(7)用户数据传输进程将该文件交给客户端文件系统进行存储。(8)文件传输完成后,由服务器主动关闭该数据连接。,6.1.3FTP工作原理,4关闭FTP除了本例中介绍的客户从FTP服务器下载一个文件时要建立数据连接外,当客户要向服务器上传一个文件或客户要求查看服务器文件列表时,也要建立相应的数据连接。因此,在下列三种情况下都需要在客户和服务器之间自动建立数据连接。从客户向服务器发送一个文件。从服务器向客户发送一个文件。从服务器向客户发送文件目录列表。,6.1.3FTP工作原理,其实客户端可以不对服务器通知数据连接的端口,在这种情况下,服务器同样可以与客户端建立一条数据连接,只不过在客户端,数据连接就使用与控制连接相同的端口号。这时,控制连接和数据连接可以分别表示如下。控制连接:数据连接:,6.1.4FTP命令和应答,1FTP命令FTP命令都是由三个或四个大写ASCII码字符组成的,表6.1列出了FTP命令,共分为三大类。2FTP应答(1)服务器为了对数据传输的请求和过程进行同步,这是TCP所要求的,TCP要求对接收到的数据都要进行确认。(2)为了使用户了解服务器的状态,用户可以根据收到的状态信息对服务器是否正常执行了有关操作进行判断。,6.1.4FTP命令和应答,三位数字每位都有特定的意义,详细内容见表6.2。,6.1.5FTP网络环境搭建和使用,1安装FTP服务组件FTP服务组件不是Windows操作系统默认安装的,当需要使用时要由用户补装添加这个组件。选择菜单命令“开始”“控制面板”,双击“添加或删除程序”项,在弹出的对话框左侧单击“添加/删除Windows组件”选项,如图6.3所示。,6.1.5FTP网络环境搭建和使用,在弹出的“Windows组件向导”对话框中勾选“Internet信息服务”复选框,单击“详细信息”按钮,如图6.4所示。,6.1.5FTP网络环境搭建和使用,在弹出的“Internet信息服务(IIS)”对话框中找到“文件传输协议(FTP)服务”项并勾选。然后连续单击“确定”按钮,直至回到如图6.5所示的界面。,6.1.5FTP网络环境搭建和使用,找到安装操作系统时使用的Windows系统安装盘,放入光驱后单击“确定”按钮,如图6.6所示,系统将自动启动安装过程。,6.1.5FTP网络环境搭建和使用,2配置FTP站点选择菜单命令“开始”“控制面板”“性能和维护”“管理工具”“Internet信息服务”,打开如图6.7所示的“Internet信息服务”窗口。,6.1.5FTP网络环境搭建和使用,为了以后测试FTP程序向服务器上传(删除)文件等“写入”类功能,必须同时开放FTP服务器的读和写权限,右击“默认FTP站点”“属性”,在如图6.8所示的“默认FTP站点属性”对话框中选择“主目录”选项卡。,6.1.5FTP网络环境搭建和使用,最后,将FTP站点的“写入”权限也一并开放,操作如图6.9所示。,6.1.5FTP网络环境搭建和使用,3测试FTP站点FlashFXP是一款功能强大的FTP客户端软件,拥有庞大的用户群和丰富的种子资源,其主界面如图6.10所示。,6.1.5FTP网络环境搭建和使用,选择菜单命令“会话”“快速连接”,在如图6.11所示的“快速连接”对话框的“地址或URL”栏中输入“127.0.0.1”(本地计算机环回测试地址),端口保持默认“21”,匿名登录,单击“连接”按钮。,6.1.5FTP网络环境搭建和使用,右击本地目录下的文档“我的简历.doc”“传输”,如图6.12所示,文件被上传到FTP根目录下。,6.2制作FTP上传下载器,6.2.1WinInet类对FTP的支持FTP客户端编程也是主要以MFCWinInet为支撑的。WinInet提供了如图6.13所示的Internet会话类CInternetSession、连接类CInternetConnection、文件类CInternetFile、文件操作类CFileFind,以及通用异常类CInternetException等。,6.2.2设计软件界面,工程创建好后,设计软件界面如图6.14所示。,6.2.2设计软件界面,与界面各元素关联的变量见表6.3。,6.2.3编程实现,为了能在编程中使用WinInet类的功能,需要在SelfFtpUpDownloaderDlg.h中包含头文件:#includeafxinet.h勾选“匿名”复选框将触发OnNoname方法,代码所示。,6.2.3编程实现,“连接”按钮的事件过程,代码如下:voidCSelfFtpUpDownloaderDlg:OnConnect()this-ConnectFtp();/连接FTP服务器this-UpdateDir();/显示服务器上的目录和文件夹列表/以下为界面控制ServerIP.EnableWindow(false);m_port.EnableWindow(false);m_connect.EnableWindow(false);m_disconnect.EnableWindow(true);m_enterdir.EnableWindow(true);m_upload.EnableWindow(true);m_download.EnableWindow(true);m_delete.EnableWindow(true);m_noname.EnableWindow(false);m_exit.EnableWindow(false);,6.2.3编程实现,这个事件过程用到两个函数:ConnectFtp()和UpdateDir()。ConnectFtp()函数代码。FTP客户程序要建立与服务器的连接,需要一个CInternetSession和CFtpConnection对象,但并不需要直接创建CFtpConnection对象,而是通过调用CInternetSession:GetFtpConnection实现。UpdateDir()函数代码。,6.2.3编程实现,为保证连接的顺利成功,需要在SelfFtpUpDownloaderDlg.h的对话框类定义中添加CInternetSession类对象指针pInternetSession和CFtpConnection对象指针pFtpConnection的定义,还要定义指示连接成功与否的变量bconnect,另外声明上述两个函数的原型:BOOLbconnect;CInternetSession*pInternetSession;CFtpConnection*pFtpConnection;voidConnectFtp();voidUpdateDir();,6.2.3编程实现,“进入”按钮使得用户可以进入自己选中的目录文件夹,其事件代码如下:voidCSelfFtpUpDownloaderDlg:OnEnterDir()CStringselfile;m_lst.GetText(m_lst.GetCurSel(),selfile);/获取用户选择的目录名if(!selfile.IsEmpty()pInternetSession-Close();/及时关闭废弃的会话句柄this-ConnectFtp();/重新连接,保持与服务器的持续会话CStringstrdir;pFtpConnection-GetCurrentDirectory(strdir);/获得原来的工作目录strdir+=selfile;/生成新目录pFtpConnection-SetCurrentDirectory(strdir);/改变目录到当前服务目录this-UpdateDir();/更新目录列表m_goback.EnableWindow(true);,6.2.3编程实现,为使用户灵活地切换目录,程序必须提供目录返回功能,使用户能够返回上一级目录,“返回”按钮的事件过程代码如下:voidCSelfFtpUpDownloaderDlg:OnGoBack()CStringstrdir;pFtpConnection-GetCurrentDirectory(strdir);intpos;pos=strdir.ReverseFind(/);/用字符串截取的方式获得上级目录strdir=strdir.Left(pos);pInternetSession-Close();/关闭废弃的会话this-ConnectFtp();/重新连接,保持持续会话pFtpConnection-SetCurrentDirectory(strdir);this-UpdateDir();/更新目录列表,6.2.3编程实现,本例实现了用户对FTP资源的上传、下载和删除这三项最基本的操作。“上传”按钮的事件过程代码。“下载”按钮的事件过程代码。“删除”按钮的事件过程代码。,6.2.3编程实现,当用户访问完毕,单击“断开”按钮退出登录,其事件过程代码如下:voidCSelfFtpUpDownloaderDlg:OnDisconnect()pInternetSession-Close();/结束会话m_lst.ResetContent();m_lst.AddString(连接已断开!);/界面控制ServerIP.EnableWindow(true);m_port.EnableWindow(true);m_connect.EnableWindow(true);m_disconnect.EnableWindow(false);m_enterdir.EnableWindow(false);m_goback.EnableWindow(false);m_upload.EnableWindow(false);m_download.EnableWindow(false);m_delete.EnableWindow(false);m_noname.EnableWindow(true);m_exit.EnableWindow(true);,6.2.3编程实现,为了使整个程序功能完善,在客户端刚启动,用户尚未登录时,也需要进行一些初始化工作,告诉用户“目前尚未登录!”,初始化代码如下:bconnect=false;m_lst.ResetContent();m_lst.AddString(尚未连接服务器,无法浏览FTP资源!);m_connect.EnableWindow(false);m_disconnect.EnableWindow(false);m_enterdir.EnableWindow(false);m_goback.EnableWindow(false);m_upload.EnableWindow(false);m_download.EnableWindow(false);m_delete.EnableWindow(false);,6.2.4测试FTP客户端,将之前已经上传到C:Inetpubftproot下的Word文档删除,启动FTP上传下载器SelfFtpUpDownloader,如图6.15所示在IP地址栏中输入“127.0.0.1”,端口号填21,勾选“匿名”复选框,单击“连接”按钮访问本机上的FTP服务器。,6.2.4测试FTP客户端,单击“上传”按钮,弹出“打开”对话框,进入如图6.16所示的“我的文档”目录,选中“我的简历.doc”文档,单击“打开”按钮。,6.2.4测试FTP客户端,文件上传到服务器,显示“上传成功!”消息框,如图6.17所示。,6.3FTP服务器的实现,6.3.1项目框架的建立首先创建VC项目工程,工程命名为ftpSrver(“基于FTP协议的服务器”之意)。设计程序界面如图6.18所示。,6.3.1项目框架的建立,由于服务器提供了对已注册用户信息进行编辑,以及添加和删除用户的功能,所以需要另外设计一个对话框专用于设置用户信息。向工程中添加MFC类CAccountDlg,并设计对话框界面,如图6.19所示。,6.3.1项目框架的建立,为GUI界面上的各控件关联变量,见表6.4和表6.5所示。,在ftpSrverDlg.h中添加定义。,6.3.1项目框架的建立,在项目中添加类CServer和结构体CAccount(如图6.20所示)。,6.3.1项目框架的建立,在Server.h中,定义本程序将要使用的宏、结构体和类。在ftpSrverDlg.h中包含头文件:#includestdlib.h#includeServer.h同时在类CftpSrverDlg中定义:public:AccountArraym_AccountArray;CServerm_server;在ftpSrverDlg.cpp中包含头文件:#includeAccountDlg.h#include,6.3.1项目框架的建立,同时在BOOLCftpSrverDlg:OnInitDialog()中添加初始化代码:/初始化时,为服务器添加几个固定用户CAccountfixAccount;fixAccount.username=admin;/管理员fixAccount.password=admin;fixAccount.directory=C:;m_AccountArray.Add(fixAccount);CLISTACCOUNT.AddString(fixAccount.username);fixAccount.username=usr;/普通用户fixAccount.password=usr;fixAccount.directory=D:;m_AccountArray.Add(fixAccount);CLISTACCOUNT.AddString(fixAccount.username);fixAccount.username=anonymous;/匿名用户fixAccount.password=;fixAccount.directory=C:DocumentsandSettingsAllUsersDocuments;m_AccountArray.Add(fixAccount);CLISTACCOUNT.AddString(fixAccount.username);,6.3.1项目框架的建立,在初始化时,预先在服务器上注册了三个默认的用户账户:管理员、普通用户和匿名用户。它们的用户名、密码和默认根目录见表6.6。,6.3.1项目框架的建立,在Server.cpp中定义:#includeftpSrver.h/*/*globaldata*/*/DWORDg_dwTotalEventAmount=0;/总事件数DWORDg_index;WSAEVENTg_EventArrayWSA_MAXIMUM_WAIT_EVENTS;/手动重置对象LPSOCKET_INFg_SocketArrayWSA_MAXIMUM_WAIT_EVENTS;/新SOCKET_INF结构CRITICAL_SECTIONg_CriticalSection;/临界区/处理线程函数声明UINTProcessThreadIO(LPVOIDlpParam);,6.3.2FTP服务器界面总控,“启动服务”按钮事件过程代码。“停止服务”按钮的事件过程代码如下:voidCftpSrverDlg:OnStopServer()m_server.m_bStopServer=true;closesocket(m_server.sDialog);closesocket(m_server.sListen);CLISTSERVERINFO.AddString(服务已停止!);ServerIP.EnableWindow(true);CEDITPORT.EnableWindow(true);停止服务时需要先后将会话Socket和监听Socket都关闭。程序中使用BOOL型变量m_bStopServer来指示服务的开关状态,这个变量是服务类CServer的成员变量,在Server.cpp的CServer构造方法中赋初值,代码如下:CServer:CServer(void)m_bStopServer=FALSE;CServer:CServer(void),6.3.2FTP服务器界面总控,“编辑”按钮的事件过程代码。“添加用户”按钮的事件过程代码。“删除用户”按钮的事件过程代码。,6.3.3FTP服务流程的实现,ServerConfigInfo()方法代码如下:/服务器配置voidCServer:ServerConfigInfo(AccountArray*accountArray,BYTEnFild,UINTport)/账户设置intsize=(int)(*accountArray).GetCount();for(inti=0;ibuffRecv),xxx)DealWithCommand()方法代码。,6.3.5FTP实现辅助代码,1)网络连接管理类AcceptConnectRequest()(接收连接请求)代码如下:SOCKETCServer:AcceptConnectRequest(SOCKETDataConnect()(建立数据连接)代码。上段代码中用到了GetLocalAddress()函数,用于获取本地IP地址,其实现。,6.3.5FTP实现辅助代码,2)数据收发类本程序将数据接收和发送的操作分别封装在DataSend()和DataRecv()函数中,以便协议实现过程中随时调用。DataSend()函数代码。DataRecv()函数代码。对于服务器向客户端返回应答的操作也封装成SendACK()函数。SendACK()函数代码。,6.3.5FTP实现辅助代码,3)格式处理类DivideRequest()函数(分离请求信息),代码如下:voidCServer:DivideRequest(char*request,char*command,char*cmdtail)inti=0;intlen=(int)strlen(request);command0=0;for(i=0;iConnectFtp()return;this-UpdateDir();ServerIP.EnableWindow(false);m_port.EnableWindow(false);m_connect.EnableWindow(false);m_disconnect.EnableWindow(true);m_enterdir.EnableWindow(true);m_upload.EnableWindow(true);m_download.EnableWindow(true);m_delete.EnableWindow(true);m_noname.EnableWindow(false);m_exit.EnableWindow(false);m_usr.EnableWindow(false);m_pwd.EnableWindow(false);,6.4.1FTP上传下载器的改造,ConnectFtp()函数代码。在“断开”按钮的事件OnDisconnect()函数中添加以下两句代码:m_usr.EnableWindow(true);m_pwd.EnableWindow(true);在OnNoname()函数中注释掉下面这句代码:/m_connect.EnableWindow(false);在BOOLCSelfFtpUpDownloaderDlg:OnInitDialog()的初始化代码中注释掉下面这句代码:/m_connect.EnableWindow(false);,6.4.2自制客户端访问服务器,1匿名访问服务器根据服务器默认的账号,匿名(anonymous)用户的根目录为C:DocumentsandSettingsAllUsersDocuments(见表6.6),这个目录所在的位置是“我的电脑”“共享文档”。进入该目录,如图6.21所示,在其下存放一张图片。,6.4.2自制客户端访问服务器,启动FTP服务器,如图6.22所示。,6.4.2自制客户端访问服务器,接着启动修改后的FTP上传下载器,输入服务器的IP和端口后,勾选“匿名”复选框,然后单击“连接”按钮,匿名登录服务器。登录后进入匿名用户默认的根目录(我的电脑共享文档),如图6.23所示。,6.4.2自制客户端访问服务器,可以看到刚刚放在“共享文档”目录下的图片“中国第一美女蛇(魏炜).jpg”,选中其在客户端界面上单击“下载”按钮,可以下载这幅图片,如图6.24所示。,6.4.2自制客户端访问服务器,2注册用户访问服务器登录后,系统自动进入usr用户默认的D盘根目录下,如图6.25所示,将刚才下载到桌面的图片上传上去。,6.4.2自制客户端访问服务器,完成后弹出“上传成功!”消息框,如图6.26所示,可以看到图片已经成功上传到usr用户的目录下了。,
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!