为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

毕业设计(论文)-C++小型FTP服务器系统

2017-09-20 43页 doc 206KB 87阅读

用户头像

is_215732

暂无简介

举报
毕业设计(论文)-C++小型FTP服务器系统毕业设计(论文)-C++小型FTP服务器系统 Suihua University Graduation Paper A Small FTP System Based on the VC++ Student name Student number 200450433 Major Computer Science & Technology Supervising teacher Suihua University 摘 要 本程序是一个小型FTP服务器系统,实现了FTP服务器所应该具备的大多数功能,包括用户的登录,...
毕业设计(论文)-C++小型FTP服务器系统
毕业设计(论文)-C++小型FTP服务器系统 Suihua University Graduation Paper A Small FTP System Based on the VC++ Student name Student number 200450433 Major Computer Science & Technology Supervising teacher Suihua University 摘 要 本程序是一个小型FTP服务器系统,实现了FTP服务器所应该具备的大多数功能,包括用户的登录,文件的上传、下载、删除,选择数据传输模式、目录选择等,并给出相应的提示。通过该程序的开发,基本上实现了一个FTP服务器所应该具有的功能,能够解释一般的FTP命令,并且符合RFC959规范。本软件的设计,即从需求,软件设计到软件功能实现,都始终遵循软件工程的思想和方法。本文中采用了大量的图说明,使文章明确清晰,便与阅读和理解。 本程序采用VC++6.0作为开发工具,设计步骤采用自顶向下的方法。 关键词:上传;下载;VC++;FTP服务器 I Abstract This procedure is a small FTP server system, carrying out most functions that FTP server should have, including the logging of the customer, document of up load, download, delete, the choice data delivers the mode, the catalogue choice...etc., and hint homogonously for . Pass the development of that procedure, carried out the function that a FTP server should have basically, can explain the general order of FTP, and match the norm of RFC959.The design of this software, namely analytical from the need, the software designs the software function to carry out, all following the thought and the method of the software engineering always. It adopted a great deal of chart in this text elucidation, make article definitely clear, then with read and comprehend. This procedure adopts the VC++6.0 conduct and actions development tool, design step adoption from a method for get down. Key words: upload; download; VC++; FTP server II 目录 摘要„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„I Abstract„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„II 前言„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„1 第1章 FTP协议与原理„„„„„„„„„„„„„„„„„„„„„„„„„2 1.1 FTP简介„„„„„„„„„„„„„„„„„„„„„„„„„„„„2 1.2 FTP的工作原理„„„„„„„„„„„„„„„„„„„„„„„„„2 1.3 FTP运行原理„„„„„„„„„„„„„„„„„„„„„„„„„„3 1.4 FTP文件传输连接类型„„„„„„„„„„„„„„„„„„„„„„5 第2章 开发环境及工具介绍„„„„„„„„„„„„„„„„„„„„„„„8 2.1 C语言概述„„„„„„„„„„„„„„„„„„„„„„„„„„„8 2.2 VC++介绍„„„„„„„„„„„„„„„„„„„„„„„„„„„„8 2.3 VC++6.0集成开发环境„„„„„„„„„„„„„„„„„„„„„„8 2.4 MFC介绍„„„„„„„„„„„„„„„„„„„„„„„„„„„„9 2.5 SOCKET„„„„„„„„„„„„„„„„„„„„„„„„„„„„„9 第3章 FTP服务器需求分析„„„„„„„„„„„„„„„„„„„„„„„11 3.1 FTP文件传输的需求„„„„„„„„„„„„„„„„„„„„„„„11 3.2 应解决的问题„„„„„„„„„„„„„„„„„„„„„„„„„12 3.3 功能分析„„„„„„„„„„„„„„„„„„„„„„„„„„„12 第4章 系统设计与实现„„„„„„„„„„„„„„„„„„„„„„„„„13 4.1 功能要求„„„„„„„„„„„„„„„„„„„„„„„„„„„13 4.2 开发工具„„„„„„„„„„„„„„„„„„„„„„„„„„„13 4.3 主要功能与实现„„„„„„„„„„„„„„„„„„„„„„„„13 第5章 系统测试„„„„„„„„„„„„„„„„„„„„„„„„„„„„22 5.1 系统可能出现的问题与不足„„„„„„„„„„„„„„„„„„„22 5.2 采用的测试类型„„„„„„„„„„„„„„„„„„„„„„„„22 5.3 测试的过程与结果分析„„„„„„„„„„„„„„„„„„„„„22 结论„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„24 III 参考文献„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„25 附录„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„26 致谢„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„„33 IV 绥化学院2008届本科生毕业论文 前 言 进入信息时代,随着互联网普及,只要接上网络,就能从网上找到庞大的数据资源,其内容包罗万象,可以说几乎任何人都可以在Internet资源中找到自己所需要的信息资源。有了网络,使用者不但可以浏览各种各样的信息资源,还能够将自己感兴趣的资源下载到本地机上。由于网络的带宽及各种服务的限制,单纯从页面上下载显得又慢又不可靠,所以就有许多FTP工具提供出来。从根本上说,FTP就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP采用的是现在流行的Client/Server模式,由FTP客户端和FTP服务器端程序组成。通常服务器端是远程端点,用户可以通过Internet网络连接到远程的FTP服务器站点。服务器的功能是主要的。只有当FTP服务器支持各种协议和指令时,才能够开发相应的客户端程序。下面我们就来介绍一下我自己开发一个小型FTP服务器的过程与思路。 1 绥化学院2008届本科生毕业论文 第1章 FTP协议与原理 1.1 FTP简介 FTP(File Transfer Protocol)是文件传输协议的简称。 直到1994年,当WWW掌管Internet时,文件传输协议(FTP)是和e-mail一样最广泛应用的Internet客户程序。它被用于作为访问Internet主机文件的一个远程外壳。使用FTP可以连接到一个FTP服务器,在可用的目录间游历,并且传输文件。 一个FTP站点可以是公用的,私有的,或者两者兼有之。使用一个私有的账号,你可以拥有访问整个网络的目录结构,或者只是特定的区域权限。 Internet同时也是一个拥有很多允许任何人连接和传输文件的FTP服务器的中心,不管他们有没有主机上的账号。这叫做匿名FTP。当你登录到一个匿名FTP站点时,你通常使用“anonymous”作为你的用户名,“guest”或你的 e-mail地址作为密码。例如,匿名FTP经常用于发布大量的公用领域或共享软件。其中一个著名的公用FTP站点是ftp.cica.indiana.edu。 FTP的主要设计目的是用于程序之中,不过FTP程序自身已经成为任何一个TCP/IP实施的重要部分。当你在Windows 3.11、Windows95或Windows NT中使用Microsoft的TCP/IP驱动程序时,FTP.exe将被安装。实际上,FTP已经包含于Netscape [1]和其它的WWW浏览器中,因此你可以使用浏览Web的程序同时浏览FTP服务器。 1.2 FTP的工作原理 1(FTP工作原理 FTP是TCP/IP的一种具体应用,它工作在OSI模型的第七层,TCP模型的第四层上,即应用层,使用TCP传输而不是UDP,这样FTP客户在和服务器建立连接前就要经过一个被广为熟知的“三次握手”的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。采用FTP协议可使 Internet用户高效地从网上的FTP服务器下载大信息量的数据文件,将远程主机上的文件拷贝到自己的计算机上。以达到资源共享和传递信息的目的。由于FTP的使用使得Internet上出现大量为用户提供的下载服务器。Internet成为了一个巨型的 2 绥化学院2008届本科生毕业论文 软件仓库。FTP在文件传输中还支持断点续传功能,可以大幅度地减小CPU和网络带宽的开销。 2(FTP服务器登录方式的分类 我们已经知道FTP服务实际上就是将各种可用资源放在各个FTP主机中,网络上的用户可以通过Internet联到这些主机上,并且使用FTP(文件传送协议)将想要的文件拷回到自己的计算机中。在使用FTP传送文件之前,最主要的步骤就是如何联入各Internet上的FTP服务器。联入的主要步骤也就是登录(Login)的过程。通常用户在欲下载的FTP服务器上输入许可的帐号(account)和密码(password),得到该服务器许可后,即可进入。FTP服务器分为两种: 其一,为一般的FTP服务器,进入这种服务器时必须拥有该主机的帐号和密码; 其二,为匿名FTP服务器(称为anonymous FTP服务器)登录此类FTP服务器时,用户只要以“guest”或“anonymous”为帐号,并以自己的E-mail地址为密码,即可进入该FTP服务器主机,任意浏览和下载文件。当用户登录到某个FTP服务器时,如果用“guest”或“anonymous”为帐号,均无法进入,则表明该服务器不是匿名FTP服务器。实际上,匿名FTP只是FTP中的一种,它是一种开放式帐号的FTP服务器,它可以为网络上的任何使用者所利用,与非匿名的FTP不同的只是登录时的帐号为“anonymous”,而密码为任一用户的E-mail地址。现在,某些站点还明确要求使用电子邮件地址作为匿名用户密码,而不接受“guest”这样的密码。提供电子邮件地址,有助于让站点的拥有者了解到是哪些人在使用他们的服务。 1.3 FTP运行原理 FTP的工作原理与其他许多网络实用程序一样,也是基于客户/服务器模式。互联网文件传输协议(File Transfer Protocol) 标准是在FTC959说明的。该协议定义了一个在远程计算机系统和本地计算机系统之间传输文件的标准。一般来说,要传输文件的用户需先经过认证以后才能登录ftp服务器,访问在远程服务器的文件。大多数的FTP服务器往往提供一个guest的公共帐户来允许没有FTP服务器帐户的用户可以访问该FTP服务器。一个FTP会话通常包括五个软件元素的交互。就模型而言,从1973年以来并没有什么变化。如图1-1所示。 3 绥化学院2008届本科生毕业论文 图1-1 FTP协议模型 下表是交互元素列表 表1-2交互元素列表 软件要素名称 应用说明 用户接口 提供了一个用户接口并使用客户端协议解释器的服务 USERPI 客户端协议解释器,向远程服务器协议机发送命令并 且驱动客户传输过程 UPTP 客户端数据传输协议,负责实现与远端服务器进行数 据传输,并与客户端本地文件系统交互 SPI 服务器协议解释器,响应客户协议机发出的命令,并 驱动服务器端数据传输过程 SDTP 服务器数据传输协议负责和客户进行数据传输以及服 务器端文件系统通信 在一个FTP会话中,会存在两个独立的网络连接,一个是由两端的PI使用的,另一个是由两端的DTP使用的。PI之间的连接一般被称作控制连接(control connection),DTP之间的连接被称作数据连接(data connection)。通常情况下,ftp服务器监听端口号2 1来等待控制连接建立请求,当客户连接请求到达,会在客户和ftp服务器之间建立一个控制连接。而数据连接端口号的选择依赖于控制连接上的命令,通常是客户发送一个控制消息来指定客户需要建立一个数据连接来传输ftp数据(如下载/上载一个文件,显示当前目录的内容等等,都需要建立数据连接来传输数据),在该消息中,指定了客户监听并等待连接的端口号,而服务器从控制连接收到该命令,向客户端发起一个连接请求到消息中指定的端口号,客户端收到该请求以后就会建立一个数据连接。连接建立以后,服务器或客户就会主动通过该连接发送数据(可能是 4 绥化学院2008届本科生毕业论文 要传输的文件,也可能是用户在命令行上发出的IS命令的输出)。 1.4 FTP文件传输连接类型 一个完整的FTP文件传输需要建立两种类型的连接,一种为文件传输下命令,称为控制连接,另一种实现真正的文件传输,称为数据连接。 1(控制连接 客户端希望与FTP服务器建立上传下载的数据传输时,它首先向服务器的TCP 21端口发起一个建立连接的请求,FTP服务器接受来自客户端的请求,完成连接的建立过程,这样的连接就称为FTP控制连接。 2(数据连接 FTP控制连接建立之后,即可开始传输文件,传输文件的连接称为FTP数据连接。FTP数据连接就是FTP传输数据的过程,它有两种传输模式:主动传输模式(Active)和被动传输模式(PASSIVE),如图1-3所示。 图1-3主动传输模式和被动传输模式 1)主动传输模式 当FTP的控制连接建立,客户提出目录列表、传输文件时,客户端发出PORT命令与服务器进行协商,FTP服务器使用一个标准端口20作为服务器端的数据连接端口(ftp-data),与客户建立数据连接。端口20只用于连接源地址是服务器端的情况,并且端口20没有监听进程来监听客户请求。 在主动传输模式下,FTP的数据连 5 绥化学院2008届本科生毕业论文 接和控制连接方向相反,由服务器向客户端发起一个用于数据传输的连接。客户端的连接端口由服务器端和客户端通过协商确定。主动传输模式下,FTP服务器使用20端口与客户端的暂时端口进行连接,并传输数据,客户端只是处于接收状态。 2)被动传输模式 当FTP的控制连接建立,客户提出目录列表、传输文件时,客户端发送PASV命令使服务器处于被动传输模式,FTP服务器等待客户与其联系。FTP服务器在非20端口的其它数据传输端口上监听客户请求。 在被动传输模式下,FTP的数据连接和控制连接方向一致,由客户端向服务器发起一个用于数据传输的连接。客户端的连接端口是发起该数据连接请求时使用的端口。当FTP客户在防火墙之外访问FTP服务器时,需要使用被动传输模式。被动传输模式下,FTP服务器打开一个暂态端口等待客户端对其进行连接,并传输数据,服务器并不参与数据的主动传输,只是被动接受。到此为止我们介绍FTP工作原理,下节将介绍FTP命令。 1.5 FTP命令 FTP的主要操作都是基于各种命令基础之上的。常用的命令有: 1)USER:指用户名,它带一个参数。 格式为:USER username 2)PASS:指明与用户名对应的密码,带一个参数。 格式为:PASS password 3)LIST: [pathname] 参数表示要列文件的目录路径名,若不带参数,刚使用当前目录 PORT:指明数据连接的端口号,带六个参数。 格式为:PORT h1,h2,h3,h4,p1,p2 4)QUIT:由于要求传输文件时有登陆的过程,断开连接到应有相应的注销过程。 这个命令就是从服务器上注销的过程,如果服务器收到该命令时,没有文件 正在传达室输,刚断开控制,连接如果有文件正在传输,刚控制连接仍然保 持,直到收到有关传输结果的应答时,服务器才断开连接。 5)RETR:取得文件这条命令是FTP事务是用得最多的命令,在请求下载文件 时都有会用到。 6 绥化学院2008届本科生毕业论文 6)STOR:存放文件。 7)WYWT:请求服务器返回系统类型。 8)TYPE:表示文件类型,共有四种,所带参数也有四种,A,E ,I ,L 分别 对应ASCII,EBCDIC,IMAGB和LOCAL类型。 格式为:TYPE type 9)CMD:请求更改服务器的当前目录这各命令带一个参数,参数表示要更改的 目录名。 10)DELE:请求删除服务器上的文件。 11)MKO:请求在服务器上新建一个目录,这条命令带一个参数指明要建立的 目录名。 7 绥化学院2008届本科生毕业论文 第2章 开发环境及工具介绍 2.1 C语言概述 C语言是在70年代初创建的一种计算机语言,它既有汇编语言可以直接访问机器硬件的功能,又具有高级语言面向用户、可读性好和易于记忆的优点,因此受到广大程序员的欢迎。C是一种结构化的程序设计语言。它由顺序、选择和循环三种基本结构组成,便于实现由上到下、逐步细化的结构化程序设计。因此,用C编写的程序具有容易理解和便于维护的优点。C语言的函数结构有利于程序分割为相对独立的功能模块,为大型软件实现模块化的程序设计创造了条件。C没有依赖于硬件的输入和主、输出语句,因此用它编制的程序有较好的可移植性。C语言首先在Unix操作系 [2]统中得到了应用,由于它的这些优点很快成为当前应用最为广泛的计算机语言。 2.2 VC++介绍 Visual C++ 6.0是微软公司推出的开发Win32应用程序(Windows 95/98/2000/XP/NT)的、面向对象的可视化集成工具。它的最大优点就是提供了功能强大的MFC类库,MFC是一个很大的C++类层次结构,其中封装了大量的类及其函数,很多Windows程序所共有的标准内容可以由MFC的类来提供,MFC类为这些内容提供了用户接口的标准实现方法,程序员所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓,这将简化编程工作大大的减少程序员编写的代码 [3]数量,使编程工作变得更加轻松容易。 2.3 VC++6.0集成开发环境 Visual C++提供了一个集源程序编辑、代码编译与调试于一体的开发环境,这个环境称为集成开发环境,对于集成开发环境的熟悉程度直接影响程序设计的效率。开发环境是程序员同Visual C++的交互界面,通过它程序员可以访问C++源代码编辑器、资源编辑器,使用内部调试器,并且可以创建工程文件。Microsoft Visual C++是多个产品的集成。Visual C++从本质上讲是一个Windows应用程序。Visual C++有两个版本,对于每一个版本,都有对应的文档。 1)专业版本,它包括一个更高级的优化编译器,更广泛的文档,并能设计基于DOS的应用程序。 8 绥化学院2008届本科生毕业论文 2)标准版本,其费用较低,没有那么高级的编译器,文档较少,且不能设计基于 [4]DOS的应用程序。 2.4 MFC介绍 MFC(Microsoft Foundation Class)库是Microsoft为利用VC++开发的Windows应用程序而提供的应用程序框架,在这个框架的支持下,对于不同的应用程序,编程的主要任务是填写各自特殊部分的代码,MFC由于某种原因130多个类组成,这些类封装了两千多个API函数。MFC类库主要包括两类,一组是一般用途类,它提供了许多有用的抽象类,如Cfile类代表文件;CWnd类是窗口类,这些在Windows的编程中有重要的作用。另一类是OLE类,这一类专门用于OLE的编程。 使用MFC的优点很多,主要的优点如下: 1) 用类编程,将代码和数据封装在类中,大大减少了编程的复杂性。 2) 通过继承实现了基本的代码重用。在MFC中定义了大量类,所以可以在编程中通过继承来使用这些类,另外,MFC还在这些类中定义了大量的虚函数,也就是说,对于这些函数,不但可以保存它们原有的特性,还可以对这些函数进行修改,使之具有新的特性。 3) 提供了大量的工具方便编程。在MFC中,可以使用AppWizard(应用程序向导),来建立应用程序的框架,可以使用ClassWizard(类向导)在程序中添加类、变量以及在程序中传递各种信息。用ControlWiard(控件向导)创建可以在Windows中注册的控件等。 4) 借助设计良好的类库通常可以减少代码规模。 2.5 SOCKET (套接字) Socket 通讯机制是一种较原始的通讯机制,通过Socket的数据表现出来的形式是原始字节流信息,通讯双方只要在此基础上按照双方约定方式进行数据的格式化和解析处理工作,这样才能完成具体的应用,即实现某种协议的过程。Socket可以看成是在两个程序间进行通讯连接的两个端点,一个程序将一段信息写入一个Socket中,该Socket将这段信息发送给另外一个Socket,以便使这段信息能传达到其他程序中。图2-1是Socket的工作原理图。 9 绥化学院2008届本科生毕业论文 网卡 程序A 程序 B 网络管理软件 SockSock et et 图2-1 Socket原理图 Socket有两种主要的工作方式:有连接的和无连接的。有连接方式如流通讯;无连接方式如数据包方式。有连接的Socket操作就像一部电话。它们必须建立一个连接 [5]和一个呼叫。所有的事情在到达时的顺序与它们出发时的顺序一样。 10 绥化学院2008届本科生毕业论文 第3章 FTP服务器需求分析 3.1 FTP文件传输的需求 Internet上早期实现传输文件,并不是一件容易的事,我们知道 Internet是一个非常复杂的计算机环境,有PC,有工作站,有MAC,有大型机,据统计连接在Internet上的计算机已有上千万台,而这些计算机可能运行不同的操作系统,有运行Unix的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。 与大多数Internet服务一样,FTP也是一个客户机/服务器系统。用户通过一个支持FTP协议的客户机程序,连接到在远程主机上的FTP服务器程序。用户通过客户机程序向服务器程序发出命令,服务器程序执行用户所发出的命令,并将执行的结果返回到客户机。比如说,用户发出一条命令,要求服务器向用户传送某一个文件的一份拷贝,服务器会响应这条命令,将指定文件送至用户的机器上FTP(File Transfer Protocol 文件传输协议)是Internet 上用来传送文件的协议。在Internet上通过FTP 服务器可以进行文件的上传(Upload)或下载(Download)。FTP是实时联机服务,在使用它之前必须是具有该服务的一个用户(用户名和口令),工作时客户端必须先登录到作为服务器一方的计算机上,用户登录后可以进行文件搜索和文件传送等有关操作,如改变当前工作目录、列文件目录、设置传输参数及传送文件等。使用FTP可以传送所有类型的文件。FTP服务器的使用十分广泛,在网络上随处可见到FTP服务器。主要用于存放文件,让网络中的计算机可以共享这些文件。因此,FTP服务器要有很大的存贮空间,免费的FTP空间总是有限的,所以我们想,能不能将FTP服务器建在自己的计算机上呢,随着网络技术的不断成熟,宽带业务的不断推进,我们用动态IP将Web主机、FTP服务器和MAIL服务器搬回家,已经不再是梦想。通常服务器端是远程端点,用户可以通过Internet网络连接到远程的FTP服务器站点。 在设计程序之前,我们首先要进行一个重要的步骤—需求分析。所谓需求分析,就是分析软件用户的需求是什么。如果投入大量的人力,物力,财力,时间,开发出的软件却没人要,那所有的投入都是徒劳.如果费了很大的精力,开发一个软件,最 11 绥化学院2008届本科生毕业论文 后却不满足用户的要求,从而要重新开发过,这种返工是让人痛心疾首的.而我们现在就很明确的知道,我们的程序是用来进行局域网文件传输的,知道了这一点,我们的程序至不会全部返工,因为我们已经知道我们软件所要完成的功能是什么。 明确了程序的功能我们要近一步的分析。 3.2 应解决的问题 选择好开发工具,设想好程序将要实现的大体功能后,我们就要分析该程序所需的条件,对该程序中将要遇到的问题做一下准备工作,以便于以后设计的顺利进行。 根据我们想要在局域网内进行文件传输的要求,首先,要选择在局域网内通讯;其次,因为本程序要实现的是FTP服务器功能,所以我们要建立服务器但是为了测试服务器是否能够有效运行,我又配置了一个客户端。 3.3 功能分析 在做程序之前,我们要先确定本程序的功能,只有确定了功能,才能确定程序中使用什么函数来实现。 如果想在局域网内进行文件传输,首先要有服务器端和客户端,两者配合使用。先打开客户端和服务器,然后让客户登陆一下服务器,服务器端设制一下服务器所完成的功能,然后客户端在向服务器发送请求。 12 绥化学院2008届本科生毕业论文 第4章 系统设计与实现 4.1 功能要求 本程序是一个在局域网内实现的小型FTP文件传输。主要实现的是FTP服务器端功能,包括:FTP服务日志,在线用户的管理,统计客户端信息还有客户端上传、下载、选择数据传输模式、改变目录等,并给出相应的提示。 4.2 开发工具 本系统的实现采用的工具为Visual C++ 6.0。开发平台为Windows2000,WindowsXP。 程序界面主要包括服务器日志、在线用户、统计信息、安全管理、菜单栏、工具栏、状态栏。如图4-1所示。 图4-1 服务器用户界面 4.3 主要功能与实现 用CSocket类编制的服务器端的程序,其过程如下,其过程主要是: 1) 创建CSocket对象。 13 绥化学院2008届本科生毕业论文 2) 创建底层套接字Socket。 3) 调用Listen,开始监听从客户端发来的访问请求。 4) 如果收到请求,调用CAsyncSocket::Accept( )函数进行接收外理。 5) 建立CSocketFile对象,并且使该对象与CSocket对象具备一定的联系。 6) 建立Carchive对象,以便实现卸装(接收)数据和存储(发送)数据的目的 地址。当然,该Carchive对象应该与前面的CSocketFile对象建立联系。 7)使用Carchive对象在客户和服务器Socket之间传递数据,从而实现服务器 Socket和客户机Socket之间的通信。值得注意的是,一个给定的Carchive对 象只能在单一的方向上传递数据:或者接收,或者发送。一般情况下,可能 [6]需要两个Carchive对象来实现数据的双向传递。 4.3.1 菜单栏功能模块 菜单拦包括:服务器,查看。 服务器菜单包括:开始,停止,用户账户向导,用户账户等功能。 查看菜单包括:服务器日志,在线用户,配置,统计,安全等功能。 各项功能实现如下: 服务器功能: 1. 帐户向导:当你 登录服务器时你需要一个有效的账户,用户帐户向导将引导 您通过必要的步骤,创造一个新的用户帐户。并将其添加到用户帐户对话框,创建用 户名,如图4-2所示。 图4-2用户帐户向导窗口 通过这个窗口你可以创建自己的用户名以及密码用以登陆FTP服务器,该部分功 14 绥化学院2008届本科生毕业论文 能实现代码如下: CWizardPage1::CWizardPage1() : CPropertyPageEx(CWizardPage1::IDD, 0, IDS_HEADERTITLE1, NULL) { m_strAccountName = _T(““); m_psp.dwFlags &= ~PSP_HASHELP; } CWizardPage1::~CWizardPage1() { } void CWizardPage1::DoDataExchange(CDataExchange* pDX) { CPropertyPageEx::DoDataExchange(pDX); DDX_Text(pDX, IDC_ACCOUNTNAME, m_strAccountName); } BEGIN_MESSAGE_MAP(CWizardPage1, CPropertyPageEx) END_MESSAGE_MAP() 2(用户帐户功能:这一功能主要是服务器端添加,修改和删除用户帐户,设置目录权限(使用添加按钮以添加一个新目录,其中选定的用户帐户已具有访问权限,每小组目录您可以设定不同的权限,例如你可以给所有权限到C : \下载,但限制的权限为C : \下载\申请时,没有权限指定的目录,在这个目录中它会自动阻止用户要求上传任何子目录)。目录属性,当您添加的编辑目录的用户帐户,目录属性对话框将显示物理目录(物理目录是'真正'的路径文件夹的名称)。虚拟目录(虚拟目录是一个物理文件夹的别名,当用户连接到您的FTP服务器,它将看到这个目录名而不是真正的物理名称)。设制服务端允许客户端的权限,例如允许客户端可以下载,上传,重命名哪些服务器端的文件内容。例如用户123将: E:\盘设为许可目录,客户端就可以随时下载,上传E:\盘里面的内容,如图4-3所示。 15 绥化学院2008届本科生毕业论文 图4-3用户帐户窗口 这一功能实现,代码如下 void CUserAccountsDlg::OnDblclkDirlist(NMHDR* pNMHDR, LRESULT* pResult) { OnEditDir(); *pResult = 0; } 4.3.2查看功能模块 1(服务器日志模块的功能:在此屏幕,客户端与服务器端的连接信息以及传输信息,当客户端登陆服务器时服务器日志会显示是否与服务器连接成功,当客户端要上传文件或是下载文件成功时会记录服务器和FTP客户端的详细资料,从而有助于您追踪服务器与客户端之间所有的通讯讯息,数目之间的方括号[ ]是线程ID,如图4-4所示。 该部分功能实现代码如下: friend CLogFile& setlevel(CLogFile& os, int level) { m_nCurrentLevel = level; return os; } friend CLogFile& error_lvl(CLogFile& os) 16 绥化学院2008届本科生毕业论文 { os.m_nCurrentLevel = 1; return os; } friend CLogFile& warning_lvl(CLogFile& os) {os.m_nCurrentLevel = 2; return os; } friend CLogFile& trace_lvl(CLogFile& os) { os.m_nCurrentLevel = 3; return os; } 图4-4服务器日志窗口 2(在线用户模块的功能:通过服务器来查看在线客户端的用户名,用户IP地址, 用户登陆时间等信息,如图4-5所示。 图4-5在线用户窗口 17 绥化学院2008届本科生毕业论文 该模块功能实现代码如下: class COnlineUsersPage : public CDialog {DECLARE_DYNCREATE(COnlineUsersPage) public: void RemoveUser(DWORD nThreadID); void AddUser(DWORD nThreadID, LPCTSTR lpszName, LPCTSTR lpszAddress); COnlineUsersPage(); ~COnlineUsersPage(); enum { IDD = IDD_PROPPAGE_ONLINE }; CListCtrl m_OnlineUsers; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support protected: afx_msg void OnSize(UINT nType, int cx, int cy); virtual BOOL OnInitDialog(); afx_msg void OnContextMenu(CWnd* pWnd, CPoint point); afx_msg void OnKickUser(); afx_msg void OnEditUserAccount(); afx_msg void OnBlockIp(); DECLARE_MESSAGE_MAP() }; // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif 3(配置模块的功能:在这里,可以配置FTP服务器所有的设置。默认服务器端口为21,可以同时连接最多用户数,客户端与服务器端连接时间(当客户端已闲置的具体时间,它会自动断开),欢迎信息(当客户端连接到服务器时将会显示该文本),再见讯息(文本将显示当一个客户端从服务器断开时)其他设置,FTP服务器在Windows 18 绥化学院2008届本科生毕业论文 下启动,启动最小化在系统盘 ,并在启动时自动激活服务器。用户还可以将用户各 种信息都记录在服务器日志里,如图4-6所示。 图4-6 配置界面 可通过该图可以看出来,服务器的一些配置功能的实现代码如下: CConfigurationPage::CConfigurationPage() : CDialogResize(CConfigurationPage:: IDD) { m_nPort = 0; m_nMaxUsers = 0; m_strGoodbyeMessage = _T(““); m_bStartInTray = FALSE; m_nTimeout = 0; m_strWelcomeMessage = _T(““); m_bLaunchOnStartup = FALSE; m_bAutoActivate = FALSE; m_nLogLevel = 0; m_strApplicationName = _T(““); m_bModified = FALSE; } 19 绥化学院2008届本科生毕业论文 CConfigurationPage::~CConfigurationPage() { } BOOL CConfigurationPage::OnInitDialog() { CDialogResize::OnInitDialog(); InitResizing(FALSE, FALSE, WS_CLIPCHILDREN); UpdateDialogControls(this, FALSE); return TRUE; }//nInitDialog void CConfigurationPage::OnView() { int ExecStatus = (UINT)ShellExecute(m_hWnd, “open”, “NOTEPAD.EXE”, (LPCTSTR)theApp.m_LogFile.m_FileName, 0, SW_SHOW); switch(ExecStatus) { case 0: MessageBox(“Systeem is out of Memory”,”ShellExecute Error”,MB_OK | MB_ICONEXCLAMATION); break; case 2: MessageBox(“'NOTEPAD.EXE' is not found !”,”ShellExecute Error”,MB_OK | MB_ICONEXCLAMATION); break; default: if (ExecStatus <= 32) MessageBox(“Problem with executing of 20 绥化学院2008届本科生毕业论文 NOTEPAD.EXE”,”ShellExecute Error”,MB_OK | MB_ICONEXCLAMATION); break; } }//查看日志内容 void CConfigurationPage::OnClear() { theApp.m_LogFile.Clear(); }//清除日志文件内容 [7]到这里该系统的主要模块的功能的实现以基本完成。 21 绥化学院2008届本科生毕业论文 第5章 系统测试 5.1系统可能出现的问题与不足 经过几次的软件测试发现系统存在着一些不足之处。具体为: 1) 当客户端与服务器建立连接时,有时连接较慢。 2) 当用户向服务器上传文件时可能会传输中断,服务器仍然存在一些不稳定的数据连接。 5.2采用的测试类型 1)黑盒测试 在黑盒测试中,软件测试员只要知道软件要做什么——而无法看到盒子里的软件是如何运行的。只要进行一些输入,就能得到某种输出结果。他不知道软件如何运行,为什么会这样,只知道程序做了什么。 2)白盒测试 在白盒测试(有时称为透明盒测试)中,软件测试员可以访误码程序员的代码,并通过检查代码的线索来协助测试——可以看到盒了里面。测试员根据代码检查结果 [8]判断或多或可能出错的数目,并据此定制测试。 5.3测试的过程与结果分析 在编写程序时有时会遇到运行错误,这是由于有的地方代码编写错误只有改写一下就可以了。 首先因为创建的是服务器端,所以先登陆自己的服务器,为了查看服务器是否能够运行,又配置来了一个客户端,在二台电脑中实现客户端与服务器端之间文件的传输。首先用客户端登陆服务器,与服务器建立连接,然后上传,下载文件,看看服务器端有什么反应,但是有时会发现虽然建立了连接,但是文件传输有时会失败。而且这个服务器不可以匿名登陆所以当客户端匿名登陆时无法与服务器连接,只有用有效的用户名才可以与服务器建立连接。如图5-1所示。 22 绥化学院2008届本科生毕业论文 图5-1客户端 这是配置的一个客户端,用户只有用有效的用户名才可以登陆服务器 ,现在试着用caojianjian这个用户来登陆一下服务器,可以看到客户端有这样的显示内容。如图5-2所示。 图5-2客户端 这时客户端将会显示与服务器连接成功的信息,表示用户可以上传和下载文件了。如图5-3所示。 图5-3服务器端 这时从服务器端就可以看到有关接收的信息了。 由于限制了服务器的端口为21 所以客户端只有通过21才可以登陆服务器。 23 绥化学院2008届本科生毕业论文 结 论 毕业设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的小型FTP系统计,我摆脱了单纯的理论知识学习状态,而实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决实际工程问题的能力,同时也提高我查阅文献资料、设计手册、设计规范以及电脑能力水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富,这是我们都希望看到的也正是我们进行毕业设计的目的所在。 虽然毕业设计内容繁多,过程繁琐但我的收获却更加丰富。以前我对VC++了解不会很明确,但是现在我了解了VC++的运行环境,使用方法,以及一些命令的使用。以往编程时,不注意编程规范,致使程序运行不出来,现在在编写程序时很注意编写规范,以前一些控件不会使用,现在也都可以熟练使用了,在设计过程中一些功能的实现让我很头痛,原因是由于本身设计受到编程语言的限制,而又必须考虑本专业的一些要求规范,从而形成了一些矛盾点,这些矛盾在处理上让人很难斟酌,正是基于这种考虑我意识到,要想更完美的进行一次设计,与他人的交流沟通是很有必要的。 提高是有限的但提高也是全面的,正是这一次设计让我积累了无数实际经验,使我的头脑更好的被知识武装了起来,也必然会让我在未来的工作学习中表现出更高的应变能力,更强的沟通力和理解力。 顺利如期的完成本次毕业设计给了我很大的信心,让我了解专业知识的同时也对本专业的发展前景充满信心,今后我更会关注新项目开发,并争取尽快的掌握这些先进的知识,更好的为祖国的四化服务。 24 绥化学院2008届本科生毕业论文 参考文献 [1] Douglas E.Comer,Internet技术基础(英文版•第三版)[M],北京: 机械工业版 社,2002 [2] 史斌,C语言贯通教程[M],北京: 清华大学出版社,2001 [3] 戴锋,Visual C++程序设计基础[M],北京: 清华大学出版社,2001 [4] 张力,Visual C++高级编程[M],北京: 人民邮电出版社,2002 [5] 杨军,Visual C,, 实践与提高(网络编程篇)[M],北京: 中国铁道出版,2003 [6] 杨富国,Visual C++程序开发案例解析[M],北京: 清华大学出版社,2006 [7] 谢希仁,计算机网络(第4版)[M],北京: 电子工业出版社,2003 [8] Ron Patton,软件测试[M],北京: 机械工业出版社,2006 25 绥化学院2008届本科生毕业论文 附录 // stdafx.cpp : source file that includes just the standard includes // FTPServer.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" CString BrowseForFolder(HWND hWnd, LPCSTR lpszTitle, UINT nFlags) { // We're going to use the shell to display a // "Choose Directory" dialog box for the user. CString strResult = ""; LPMALLOC lpMalloc; if (::SHGetMalloc(&lpMalloc) != NOERROR) { // failed to get allocator return strResult; } char szBuffer[_MAX_PATH]; char szDisplayName[_MAX_PATH]; BROWSEINFO browseInfo; browseInfo.hwndOwner = hWnd; // set root at Desktop browseInfo.pidlRoot = NULL; browseInfo.pszDisplayName = szDisplayName; browseInfo.lpszTitle = lpszTitle; browseInfo.ulFlags = nFlags; browseInfo.lpfn = NULL; browseInfo.lParam = 0; LPITEMIDLIST lpItemIDList; if ((lpItemIDList = ::SHBrowseForFolder(&browseInfo)) != NULL) { // Get the path of the selected folder from the item ID list. if (::SHGetPathFromIDList(lpItemIDList, szBuffer)) { // At this point, szBuffer contains the path the user chose. 26 绥化学院2008届本科生毕业论文 if (szBuffer[0] == '\0') { // SHGetPathFromIDList failed, or SHBrowseForFolder failed. AfxMessageBox("Failed to get directory", MB_ICONSTOP|MB_OK); return strResult; } // We have a path in szBuffer! strResult = szBuffer; return strResult; } else { // The thing referred to by lpItemIDList // might not have been a file system object. // For whatever reason, SHGetPathFromIDList didn't work! AfxMessageBox("Failed to get directory", MB_ICONSTOP|MB_OK); return strResult; // strResult is empty } lpMalloc->Free(lpItemIDList); lpMalloc->Release(); } return strResult; } void DoEvents() { MSG msg; // window message while (PeekMessage(&msg,NULL,NULL,NULL,PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); } } void GetAppDir(CString& strAppDir) { TCHAR szFullPath[MAX_PATH]; TCHAR szDir[_MAX_DIR]; TCHAR szDrive[_MAX_DRIVE]; 27 绥化学院2008届本科生毕业论文 // Get application's full path. ::GetModuleFileName(NULL, szFullPath, MAX_PATH); // Break full path into seperate components. _splitpath(szFullPath, szDrive, szDir, NULL, NULL); // Store application's drive and path strAppDir.Format(_T("%s%s"), szDrive, szDir); } PFNSHGETFOLDERPATHA GetFuncPtr_SHGetFolderPathA() { static HMODULE hMod = NULL; PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL; // Load SHFolder.dll only once if (!hMod) hMod = LoadLibrary("SHFolder.dll"); // Obtain a pointer to the SHGetFolderPathA function if (hMod) pSHGetFolderPath = (PFNSHGETFOLDERPATHA)GetProcAddress(hMod, "SHGetFolderPathA"); return pSHGetFolderPath; } HRESULT CreateStartMenuShortcut(LPSTR lpszShortcutFile, LPSTR lpszDescription, LPTSTR lpszRelativeFolder) { HRESULT hr; PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL; TCHAR lpszLink[MAX_PATH]; BOOL bFound = FALSE; pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA(); // Find the current user's Start Menu Programs folder if (pSHGetFolderPath) bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink)); if (bFound) { // Proceed to create the shortcut IShellLink *pIShellLink = NULL; IPersistFile *ppf = NULL; WCHAR pLinkUnicode[MAX_PATH]; 28 绥化学院2008届本科生毕业论文 CoInitialize(NULL); // Get a pointer to the IShellLink interface. hr = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&pIShellLink); if (SUCCEEDED(hr)) { // Get a pointer to IPersistFile interface for saving shortcut hr = pIShellLink->QueryInterface(IID_IPersistFile, (void **)&ppf); if (SUCCEEDED(hr)) { hr = pIShellLink->SetPath(lpszShortcutFile); hr = pIShellLink->SetDescription(lpszDescription); if (SUCCEEDED(hr)) { // Add the target folder to the Start Menu Programs path lstrcat(lpszLink, "\\"); lstrcat(lpszLink, lpszRelativeFolder); lstrcat(lpszLink, "\\"); // Create the directory if it does not exist CreateDirectory(lpszLink,NULL); // Add the file name for the shortcut lstrcat(lpszLink, lpszDescription); lstrcat(lpszLink, ".lnk"); // Convert string to Unicode, and call IPersistFile::Save() MultiByteToWideChar(CP_ACP, 0, lpszLink, -1, pLinkUnicode, MAX_PATH); hr = ppf->Save(pLinkUnicode, TRUE); } ppf->Release(); } pIShellLink->Release(); } CoUninitialize(); } return hr; 29 绥化学院2008届本科生毕业论文 } void RemoveStartMenuShortcut(LPSTR lpszDescription, LPTSTR lpszRelativeFolder) { PFNSHGETFOLDERPATHA pSHGetFolderPath = NULL; TCHAR lpszLink[MAX_PATH]; BOOL bFound = FALSE; pSHGetFolderPath = GetFuncPtr_SHGetFolderPathA(); // Find the current user's Start Menu Programs folder if (pSHGetFolderPath) bFound = SUCCEEDED(pSHGetFolderPath(NULL, CSIDL_PROGRAMS, NULL, 0, lpszLink)); if (bFound) { // Add the target folder to the Start Menu Programs path lstrcat(lpszLink, "\\"); lstrcat(lpszLink, lpszRelativeFolder); lstrcat(lpszLink, "\\"); // Add the file name for the shortcut lstrcat(lpszLink, lpszDescription); lstrcat(lpszLink, ".lnk"); DeleteFile(lpszLink); } } CString GetShortcutTarget(LPCTSTR lpszFilename) { CoInitialize(0); CString strResult; HRESULT hResult; IShellLink *psl; char szPath[MAX_PATH]; WIN32_FIND_DATA findData; // Get a pointer to the IShellLink interface. hResult = CoCreateInstance (CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, (void **)&psl); if (SUCCEEDED(hResult)) { IPersistFile *ppf; // Get a pointer to the IPersistFile interface. hResult = psl->QueryInterface (IID_IPersistFile, (void **)&ppf); 30 绥化学院2008届本科生毕业论文 if (SUCCEEDED(hResult)) { WORD wsz [MAX_PATH]; // buffer for Unicode string // Ensure that the string consists of Unicode characters. MultiByteToWideChar (CP_ACP, 0, lpszFilename, -1, wsz, MAX_PATH); // Load the shortcut. hResult = ppf->Load (wsz, STGM_READ); if (SUCCEEDED (hResult)) { // Resolve the shortcut. hResult = psl->Resolve (0, SLR_ANY_MATCH|SLR_NO_UI); if (SUCCEEDED (hResult)) { lstrcpy (szPath, lpszFilename); // Get the path to the shortcut target. hResult = psl->GetPath(szPath, MAX_PATH, (WIN32_FIND_DATA *)&findData, 0); strResult = szPath; } } // Release the pointer to IPersistFile. ppf->Release (); } // Release the pointer to IShellLink. psl->Release (); } CoUninitialize(); if (SUCCEEDED(hResult)) return strResult; else return ""; } // Pump messages while waiting for event BOOL WaitWithMessageLoop(HANDLE hEvent, int nTimeout) { DWORD dwRet; while (1) { // wait for event or message, if it's a message, process it and return to waiting state dwRet = MsgWaitForMultipleObjects(1, &hEvent, FALSE, nTimeout, QS_ALLINPUT); 31 绥化学院2008届本科生毕业论文 if (dwRet == WAIT_OBJECT_0) { TRACE0("WaitWithMessageLoop() event triggered.\n"); return TRUE; } else if (dwRet == WAIT_OBJECT_0 + 1) { // process window messages AfxGetApp()->PumpMessage(); } else if (dwRet == WAIT_TIMEOUT) { // timed out ! return FALSE; } else { // WAIT_ABANDONED_0 ... return TRUE; } } } void AutoSizeColumns(CListCtrl *pListCtrl) { // Call this after your the control is filled pListCtrl->SetRedraw(FALSE); int mincol = 0; int maxcol = pListCtrl->GetHeaderCtrl()->GetItemCount()-1; for (int col = mincol; col <= maxcol; col++) { pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE); int wc1 = pListCtrl->GetColumnWidth(col); pListCtrl->SetColumnWidth(col, LVSCW_AUTOSIZE_USEHEADER); int wc2 = pListCtrl->GetColumnWidth(col); // 10 is minumim column width int wc = max(10, max(wc1,wc2)); pListCtrl->SetColumnWidth(col,wc); } pListCtrl->SetRedraw(TRUE); } 32 绥化学院2008届本科生毕业论文 致 谢 四年的大学生活转眼就要结束了,在即将毕业之际,为了考验我们四年来所学知识的成果,以及加强我们分析解决计算机应用实际问题的能力和培养我们调查研究、查阅技术文献、资料、手册以及编写技术文献的能力,学校安排我们这次毕业设计。通过这次毕业设计,我们各方面都得到了很好的锻炼。本课题在选题及研究过程中得到赵卫绩老师的悉心指导,赵老师多次询问研究进程,并为我指点迷津,帮助我开拓研究思路,精心点拨、热忱鼓励。赵老师一丝不苟的作风,严谨求实的态度,踏踏实实的精神,不仅授我以文,而且教我做人,虽历时不长,却给以终生受益无穷之道。 感谢赵老师,这篇论文的每个实验细节和每个数据,都离不开你的细心指导。 感谢我的室友们,从遥远的家来到这个陌生的城市里,是你们和我共同维系着彼此之间姐妹般的感情,维系着寝室那份家的融洽。四年了,仿佛就在昨天。四年里,我们没有红过脸,没有吵过嘴,没有发生上大学前所担心的任何不开心的事情。只是今后大家就难得再聚在一起吃每年元旦那顿饭了吧,没关系,各奔前程,大家珍重。 感谢我的爸爸妈妈,焉得谖草,言树之背,养育之恩,无以回报,你们永远健康快乐是我最大的心愿。 在论文即将完成之际,我的心情无法平静,从开始进入课题到论文的顺利完成,有多少可敬的师长、同学、朋友给了我无言的帮助,在这里请接受我诚挚的谢意~ 最后,谨以此稚嫩的论文献给所有关心和帮助过我的老师、亲人、同学、和朋友们。我唯有在以后不断地努力进取,以学业和工作的继续求索来感谢培育我的母校和所有关心我的师长亲朋~希望我们都幸福快乐~ 33
/
本文档为【毕业设计(论文)-C++小型FTP服务器系统】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索