VC++的FTP客户端设计与开发(含源文件)

更新时间:2024-07-07 08:06:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

摘 要

FTP是Internet上用来传送文件的协议。它是为了我们能够在Internet上互相传送文件而制定的文件传送标准,规定了Internet上文件如何传送。通过FTP协议,我们就可以跟Internet上的FTP服务器进行文件的上传或下载。本文以实现一个简单易用的FTP客户端为目标,通过分析FTP协议的基本工作原理和FTP的数据传输原理,研究如何使用VC+=工具对FTP客户端进行设计,用VC++6.0编程工具设计和实现了FTP服务与客户端设计,从而实现了对FTP客户端的开发。

关键词: VC++;文件传输协议;客户端

Abstract

FTP is a protocol used to transfer files on the Internet. It is enacted in order that we can send each other files on the Internet file transfer standards, regulations on how to send files on the Internet. Through the FTP protocol, we can tell the FTP server on the Internet for file upload or download. This article is an easy-to-use FTP client in order to achieve the goal through the analysis of the basic working principle of the FTP protocol and FTP data transmission principle, how to use VC + = tools FTP client to design, designed using VC + +6.0 programming tools and FTP service, and client design that enables the development of the FTP client

Key words: VC++; FTP, Client

目 录

论文总页数:21页

1

引言 .................................................................................................................................................. 1 1.1 1.2 1.3 1.4 2

课题背景 ................................................................................................................................. 1 国内外研究现状 ..................................................................................................................... 1 本课题研究的意义 ................................................................................................................. 1 本课题的研究方法 ................................................................................................................. 2

技术背景 .......................................................................................................................................... 2 2.1 2.2 2.3 2.4

VC++技术简介 ....................................................................................................................... 2 FTP简介 .................................................................................................................................. 2 FTP工作模式 .......................................................................................................................... 3 SSL协议加密 ......................................................................................................................... 3

3 FTP软件需求分析 ........................................................................................ 错误!未定义书签。 3.1 3.2 3.3

需要完成目标 ....................................................................................... 错误!未定义书签。 功能需求 ............................................................................................... 错误!未定义书签。 环境需求 ............................................................................................... 错误!未定义书签。

4 FTP软件详细设计与实现 ............................................................................................................ 12 4.1 4.2

软件总体分析与设计 ........................................................................................................... 12 各模块具体设计 ................................................................................................................... 12

连接管理设计 ...............................................................................................................12 文件管理设计 ...............................................................................................................14 文件传输设计 ...............................................................................................................14 辅助功能设计 ...............................................................................................................14

4.2.1 4.2.2 4.2.3 4.2.4 4.3

模块的程序实现 ................................................................................................................... 15

连接管理的程序实现 ...................................................................................................15 文件管理的程序实现 ...................................................................................................16 文件传输的程序实现 ...................................................................................................17 辅助功能的程序实现 ...................................................................................................18

4.3.1 4.3.2 4.3.3 4.3.4

4.3.5 ftp传输过程加密实现 .........................................................................................................20 5

软件测试 ........................................................................................................................................ 20 5.1 5.2 5.3

测试前分析 ........................................................................................................................... 20 测试的过程与分析 ............................................................................................................... 20 测试小结 ............................................................................................................................... 22

结 论 ................................................................................................................................................ 23

参考文献 ................................................................................................................................................ 24 致 谢 ................................................................................................................................................ 24

1 引言

1.1 课题背景

FTP是Internet上最早也是最广的应用,直到今天它仍是最重要和最基本的应用之一。用FTP将信息下载到本地是一件十分普遍的事。也随之出现了许多下载软件。尽管远程登录(Telnet)提供了访问远程文件的极好方法,但怎么也比不上使用自己计算机中的文件方便。如果用户想使用其它计算机上的文件,最理想的方法就是把它COPY到自己的计算机中,以便在本地计算机上操作。FTP正是完成这项工作的工具,你可以在任意一个经过文件传输协议(FTP)访问的公共有效的联机数据库或文档中找到你想要的任何东西。全世界现在已有1000多个(96年的数据)FTP文件服务器对所有INTERNET用户开使用,用户可以通过与Internet相连到远程计算机,把自己需要的文件传输过来或是把自己的收集传输上去与他人共享。传统的数据库应用系统采用的是客户机/服务器(Client/Server)模式,有高度的交互性,高效的用户界面等优点。

1.2 国内外研究现状

1971年,第一个FTP的RFC(RFC 114)由A.K.Bhushan在1971年提出,同时由MIT与Harvard实验实现;1972年,RFC 172 提供了主机间文件传输的一个用户级协议;1973年2月,在长期讨论(RFC 265,RFC 294,RFC 354,RFC 385,RFC 430)后,出现了一个官方文档RFC 454;1973年8月,出现了一个修订后的新官方文档 RFC 542,确立了FTP的功能、目标和基本模型。当时数据传输协议采用NCP;1980年,由于底层协议从NCP改变为TCP,RFC 765 定义了采用TCP的FTP;1985年,一个作用持续至今的官方文档RFC 959(STD 9)出台。用FTP传输文件,本来用户事先应在远方系统注册,但后来为了便于大家获取资源,FTP在互联网上有一种特殊的也是非常广泛的应用是匿名FTP (anonymous FTP)。通过Internet,任何用户可以使用FTP和一个公用账号(通常账号名是anonymous)去获得一些公用资源。在Internet上目前有许许多多的这种公用计算机,我们把这种用来做匿名FTP服务的计算机称作FTP服务器(FTPSite),对每一个联入Internet的用户,只要知道这些FTP服务器的地址,就可以与它们连接并获取上面各种资源。由于FTP操作简单实用,开放性强,且能充分利用Internet来进行信息传递与交流,所以目前越来越多的FTP服务器连入Internet,这样越来越多的资源就可以通过匿名FTP来获得。

1.3 本课题研究的意义

进一步熟悉VC++开发环境,掌握一定开发Windows应用程序技术。对提高自己的VC++语言编程能力,熟悉ftp工作过程。制作一个界面友好,快速,稳定的下在软件。对信息的快速共享起着一定的作用。让用户能第一时间和别人

第 1 页 共 21 页

共同分享信息资源。并希望能给FTP客户端编写初学者一些帮助。

1.4 本课题的研究方法

用Visual StudioVC++2003开发FTP客户端软件。根据现有的FTP软件进行设计与实现。综合以前所学的相关知识:包括计算机网络技术、TCP/IP详解、信息安全相关知识等;查阅Windows应用程序开发资料,学习VC++语言,FTP通信过程。

2 技术背景

2.1 VC++技术简介

VC++技术是2000年微软公司推出的全新概念,它代表了一个集合、一个环境、一个编程的基础结构。其目的是将互联网本身作为构建新一代操作系统的基础,对互联网和操作系统的设计思想进行延伸。具体地说,VC++技术就是要在不同的网站之间建立起协定,促进网站之间的协同合作,实现信息的自动交流,从而帮助用户最大限度地获取信息、并对他们的数据进行简单、高效的管理。

2.2 FTP简介

FTP 是 TCP/IP 协议组中的协议之一,是英文File Transfer Protocol的缩写。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。

从根本上说,FTP协议就是在网络中各种不同的计算机之间按照TCP/IP协议来传输文件。FTP协议采用客户机/服务器 (Client/Sever)模式,由FTP客户端程序和FTP服务器端程序组成。使用时,先启动FTP客户端程序与远程主机建立连接,然后向远程主机发出传输命令,远程主机在收到命令后就给予响应,并执行正确的命令。但是FTP有一个根本的限制,那就是,如果用户在某个主机上没有注册获得授权,即没有用户名和口令,就不能与该主机进行文件传输。但匿名FTP服务器除外,它能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“Anonymous”或“guest”就可有限制地访问远程主机上公开的文件。现在许多系统要求用户将Emai1地址作为口令,以便更好地对访问者进行跟踪。出于安全的目的,大部分匿名FTP主机一般只允许远程用户下载(download)文

第 2 页 共 21 页

件,而不允许上载(upload)文件。也就是说,用户只能从匿名FTP主机拷贝其需要的文件而不能把文件拷贝到匿名FTP主机。另外,匿名FTP主机还采用了其他一些保护措施以保护自己的文件不至于被用户修改和删除,并防止计算机病毒的侵入。匿名FTP一直是Internet上获取信息资源的最主要方式,在Internet成千上万的匿名FTP主机中存储着无以计数的文件,这些文件包含了各种各样的信息、数据和软件。人们只要知道特定信息资源的主机地址,就可以用匿名FTP登录。

2.3 FTP工作模式

FTP支持两种模式,一种方式叫做Standard(也就是 PORT方式,主动方式),一种是Passive(也就是PASV,被动方式)。Standard模式FTP的客户端发送PORT命令到FTP服务器。Passive模式FTP的客户端发送PASV命令到FTP Server。

1.主动方式的FTP工作过程:Port模式FTP客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。

针对FTP服务器前面的防火墙来说,必须允许以下通讯才能支持主动方式FTP:

1).任何端口到FTP服务器的21端口(客户端初始化的连接S?C)。 2).FTP服务器的21端口到大于1023的端口(服务器响应客户端的控制端口S?C)。

3).FTP服务器的20端口到大于1023的端口(服务器端初始化数据连接到客户端的数据端口S?C)。

4).大于1023端口到FTP服务器的20端口(客户端发送ACK响应到服务器的数据端口S?C)。

连接过程如下图1:

2.4 SSL介绍

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。

SSL协议位于TCP/IP协议与各种应用层协议之间,为数据通讯提供安全支持。SSL协议可分为两层: SSL记录协议(SSL Record Protocol):它建立在可靠的传输协议(如TCP)之上,为高层协议提供数据封装、压缩、加密等基

第 3 页 共 21 页

本功能的支持。 SSL握手协议(SSL Handshake Protocol):它建立在SSL记录协议之上,用于在实际的数据传输开始前,通讯双方进行身份认证、协商加密算法、交换加密密钥等。

SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器; 2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变。 SSL协议的工作流程:

服务器认证阶段:1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接;2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证。

从SSL 协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准

第 4 页 共 21 页

图1 FTP主动模式连接过程图

在第1步中,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令“PORT 1027”。然后在第2步中,FTP服务器给客户端的命令端口返回一个\。在第3步中,FTP服务器发起一个从它自己的数据端口(20)到客户端先前指定的数据端口(1027)的连接,最后客户端在第4步中给服务器端回一个\。

主动方式FTP的主要问题实际上在于客户端。FTP的客户端并没有实际建立一个到服务器数据端口的连接,它只是简单的告诉服务器自己监听的端口号,服务器再回来连接客户端这个指定的端口。对于客户端的防火墙来说,这是从外部系统建立到内部客户端的连接,这是通常会被阻塞的。

2.被动方式的FTP是这样的:在被动方式FTP中,命令连接和数据连接都由客户端,这样就可以解决从服务器到客户端的数据端口的进入方向连接被防火墙过滤掉的问题。当开启一个FTP连接时,客户端打开两个任意的非特权本地端口(N>1024和N+1)。第一个端口连接服务器的21端口,但与主动方式的FTP不同,客户端不会提交PORT命令并允许服务器来回连它的数据端口,而是提交PASV命令。这样做的结果是服务器会开启一个任意的非特权端口(P>1024),并发送PORT P命令给客户端。然后客户端发起从本地端口N+1到服务器的端口P的连接用来传送数据。

对于服务器端的防火墙来说,必须允许下面的通讯才能支持被动方式的FTP:

1).从任何端口到服务器的21端口(客户端初始化的连接S?C)。 2).服务器的21端口到任何大于1023的端口(服务器响应到客户端的控制端口的连接S?C)。

3).从任何端口到服务器的大于1023端口(入;客户端初始化数据连接到服务器指定的任意端口S?C)。

第 5 页 共 21 页

4).服务器的大于1023端口到远程的大于1023的端口(出;服务器发送ACK响应和数据到客户端的数据端口S?C)。

被动方式的FTP连接过程如下图2:

图2 FTP主动模式连接过程图

在第1步中,客户端的命令端口与服务器的命令端口建立连接,并发送命令“PASV”。然后在第2步中,服务器返回命令\2024\,告诉客户端(服务器)用哪个端口侦听数据连接。在第3步中,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。最后服务器在第4步中给客户端的数据端口返回一个\响应。

被动方式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到服务器高位端口的连接。幸运的是,许多FTP守护程序,包括流行的WU-FTPD允许管理员指定FTP服务器使用的端口范围。

第二个问题是客户端有的支持被动模式,有的不支持被动模式,必须考虑如何能支持这些客户端,以及为他们提供解决办法。例如,Solaris提供的FTP命令行工具就不支持被动模式,需要第三方的FTP客户端,比如ncftp。

随着WWW的广泛流行,许多人习惯用web浏览器作为FTP客户端。大多数浏览器只在访问ftp://这样的URL时才支持被动模式。这到底是好还是坏取决于服务器和防火墙的配置。

很多防火墙在设置的时候都是不允许接受外部发起的连接的,所以许多位于防火墙后或内网的FTP服务器不支持PASV模式,因为客户端无法穿过防火墙打开FTP服务器的高端端口;而许多内网的客户端不能用PORT模式登录FTP服务器,因为从服务器的TCP20无法和内部网络的客户端建立一个新的连接,造成无法工作。

第 6 页 共 21 页

下面是主动与被动FTP优缺点的简要总结:

主动FTP对FTP服务器的管理有利,但对客户端的管理不利。因为FTP服务器企图与客户端的高位随机端口建立连接,而这个端口很有可能被客户端的防火墙阻塞掉。被动FTP对FTP客户端的管理有利,但对服务器端的管理不利。因为客户端要与服务器建立两个连接,其中一个连到一个高位随机端口,而这个端口很有可能被服务器端的防火墙阻塞掉。

FTP服务器的管理员需要他们的服务器有最多的客户连接,那么必须得支持被动FTP。我们可以通过为FTP服务器指定一个有限的端口范围来减小服务器高位端口的暴露。这样,不在这个范围的任何端口会被服务器的防火墙阻塞。虽然这没有消除所有针对服务器的危险,但它大大减少了危险。

3 SSL协议安全加密

SSL是一种在客户端和服务器端之间建立安全通道的协议。SSL一经提出,就在Internet上得到广泛的应用。SSL最常用来保护Web的安全。为了保护存有敏感信息Web的服务器的安全,消除用户在Internet上数据传输的安全顾虑。

OpenSSL是一个支持SSL认证的服务器.它是一个源码开放的自由软件,支持多种操作系统。OpenSSL软件的目的是实现一个完整的、健壮的、商业级的开放源码工具,通过强大的加密算法来实现建立在传输层之上的安全性。OpenSSL包含一套SSL协议的完整接口,应用程序应用它们可以很方便的建立起安全套接层,进而能够通过网络进行安全的数据传输。协议的起源 :随着计算机网络技术向整个经济社会各层次延伸,整个社会表现对Internet、Intranet 、Extranet等使用的更大的依赖性。随着企业间信息交互的不断增加,任何一种网络应用和增值服务的使用程度将取决于所使用网络的信息安全有无保障,网络安全已成为现代计算机网络应用的最大障碍,也是急需解决的难题之一。

由于Web上有时要传输重要或敏感的数据,因此Netscape公司在推出Web浏览器首版的同时,提出了安全通信协议SSL(Secure Socket Layer),目前已有2.0和3.0版本。SSL采用公开密钥技术。其目标是保证两个应用间通信的保密性和可靠性,可在服务器和客户机两端同时实现支持。目前,利用公开密钥技术的SSL协议,并已成为Internet上保密通讯的工业标准。现行Web浏览器普遍将HTTP和SSL相结合,从而实现安全通信

3.1 SSL协议概述

SSL 是Secure socket Layer英文缩写,它的中文意思是安全套接层协议,指使用公钥和私钥技术组合的安全网络通讯协议。SSL协议是网景公司

第 7 页 共 21 页

(Netscape)推出的基于 WEB应用的安全协议,SSL协议指定了一种在应用程序协议(如Http、Telenet、NMTP和FTP等)和TCP/IP协议之间提供数据安全性分层的机制,它为TCP/IP连接提供数据加密、服务器认证、消息完整性以及可选的客户机认证,主要用于提高应用程序之间数据的安全性,对传送的数据进行加密和隐藏,确保数据在传送中不被改变,即确保数据的完整性。SSL协议提供的服务主要有:

1)认证用户和服务器,确保数据发送到正确的客户机和服务器; 2)加密数据以防止数据中途被窃取;

3)维护数据的完整性,确保数据在传输过程中不被改变

SSL 以对称密码技术和公开密码技术相结合,可以实现如下三个通信目标:

(1)秘密性: SSL客户机和服务器之间传送的数据都经过了加密处理,网络中的非法窃听者所获取的信息都将是无意义的密文信息。

(2)完整性: SSL利用密码算法和散列(HASH)函数,通过对传输信息特征值的提取来保证信息的完整性,确保要传输的信息全部到达目的地,可以避免服务器和客户机之间的信息受到破坏。

(3)认证性:利用证书技术和可信的第三方认证,可以让客户机和服务器相互识别对方的身份。为了验证证书持有者是其合法用户(而不是冒名用户), SSL要求证书持有者在握手时相互交换数字证书,通过验证来保证对方身份的合法性

3.2 SSL协议的体系结构

SSL协议位于TCP/IP协议模型的网络层和应用层之间,使用TCP来提供一种可靠的端到端的安全服务,它是客户/服务器应用之间的通信不被攻击窃听,并且始终对服务器进行认证,还可以选择对客户进行认证。SSL协议在应用层通信之前就已经完成加密算法、通信密钥的协商以及服务器认证工作,在此之后,应用层协议所传送的数据都被加密。SSL实际上是共同工作的两层协议组成,如图3-2所示。从体系结构图可以看出SSL安全协议实际是SSL握手协议、SSL修改密文协议、SSL警告协议和SSL记录协议组成的一个协议族

图 3-2

第 8 页 共 21 页

SSL记录协议为SSL连接提供了两种服务:一是机密性,二是消息完整性。为了实现这两种服务, SSL记录协议对接收的数据和被接收的数据工作过程是如何实现的呢? SSL记录协议接收传输的应用报文,将数据分片成可管理的块,进行数据压缩(可选),应用MAC,接着利用IDEA、DES、3DES或其他加密算法进行数据加密,最后增加由内容类型、主要版本、次要版本和压缩长度组成的首部。被接收的数据刚好与接收数据工作过程相反,依次被解密、验证、解压缩和重新装配,然后交给更高级用户SSL修改密文协议是使用SSL记录协议服务的SSL高层协议的3个特定协议之一,也是其中最简单的一个。协议由单个消息组成,该消息只包含一个值为1的单个字节。该消息的唯一作用就是使未决状态拷贝为当前状态,更新用于当前连接的密码组。为了保障SSL传输过程的安全性,双方应该每隔一段时间改变加密规范。

SSL告警协议是用来为对等实体传递SSL的相关警告。如果在通信过程中某一方发现任何异常,就需要给对方发送一条警示消息通告。警示消息有两种:一种是 Fatal错误,如传递数据过程中,发现错误的MAC,双方就需要立即中断会话,同时消除自己缓冲区相应的会话记录;第二种是Warning消息,这种情况,通信双方通常都只是记录日志,而对通信过程不造成任何影响。SSL握手协议可以使得服务器和客户能够相互鉴别对方,协商具体的加密算法和MAC算法以及保密密钥,用来保护在SSL记录中发送的数据SSL握手协议允许通信实体在交换应用数据之前协商密钥的算法、加密密钥和对客户端进行认证(可选)的协议,为下一步记录协议要使用的密钥信息进行协商,使客户端和服务器建立并保持安全通信的状态信息。SSL握手协议是在任何应用程序数据传输之前使用的。SSL握手协议包含四个阶段:第一个阶段建立安全能力;第二个阶段服务器鉴别和密钥交换;第三个阶段客户鉴别和密钥交换;第四个阶段完成握手协议

3.3协议的工作流程

服务器认证阶段:

1)客户端向服务器发送一个开始信息“Hello”以便开始一个新的会话连接。

2)服务器根据客户的信息确定是否需要生成新的主密钥,如需要则服务器在响应客户的“Hello”信息时将包含生成主密钥所需的信息;

3)客户根据收到的服务器响应信息,产生一个主密钥,并用服务器的公开密钥加密后传给服务器;

4)服务器恢复该主密钥,并返回给客户一个用主密钥认证的信息,以此让客户认证服务器。

第 9 页 共 21 页

用户认证阶段:在此之前,服务器已经通过了客户认证,这一阶段主要完成对客户的认证。经认证的服务器发送一个提问给客户,客户则返回(数字)签名后的提问和其公开密钥,从而向服务器提供认证.

从SSL协议所提供的服务及其工作流程可以看出,SSL协议运行的基础是商家对消费者信息保密的承诺,这就有利于商家而不利于消费者。在电子商务初级阶段,由于运作电子商务的企业大多是信誉较高的大公司,因此这问题还没有充分暴露出来。但随着电子商务的发展,各中小型公司也参与进来,这样在电子支付过程中的单一认证问题就越来越突出。虽然在SSL3.0中通过数字签名和数字证书可实现浏览器和Web服务器双方的身份验证,但是SSL协议仍存在一些问题,比如,只能提供交易中客户与服务器间的双方认证,在涉及多方的电子交易中,SSL协议并不能协调各方间的安全传输和信任关系。在这种情况下,Visa和 MasterCard两大信用卡公组织制定了SET协议,为网上信用卡支付提供了全球性的标准。

3.4 SL协议的实现

基于OpenSSL的程序可以被分为两个部分:客户机和服务器,使用SSL协议使通信双方可以相互验证对方身份的真实性,并且能够保证数据的完整性和机密性。建立SSL通信的过程如图3-4。所示:

图3-4

? SSL通信模型采用标准的C/S结构,除了在TCP层上进行传输之外,与普通的网络通信协议没有太大的区别,基于OpenSSL的程序都要遵循以下几个步骤:

? (1) OpenSSL初始化

第 10 页 共 21 页

? 在使用OpenSSL之前,必须进行相应的协议初始化工作,这可以通过下面的函数实现:

? int SSL_library_int(void); ? (2) 选择会话协议

? 在利用OpenSSL开始SSL会话之前,需要为客户端和服务器制定本次会话采用的协议,目前能够使用的协议包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3。

? 需要注意的是,客户端和服务器必须使用相互兼容的协议,否则SSL会话将无法正常进行。

? (3) 创建会话环境

在OpenSSL中创建的SSL会话环境称为CTX,使用不同的协议会话,其环境也不一样的

? 4) 建立SSL套接字

? SSL套接字是建立在普通的TCP套接字基础之上,在建立SSL套接字时可以使用下面的一些函数:

? SSL *SSl_new(SSL_CTX *ctx); ? //申请一个SSL套接字

? int SSL_set_fd(SSL *ssl,int fd);) ? //绑定读写套接字

? int SSL_set_rfd(SSL *ssl,int fd); ? //绑定只读套接字

? int SSL_set_wfd(SSL *ssl,int fd); ? //绑定只写套接字 ? (5) 完成SSL握手

? 在成功创建SSL套接字后,客户端应使用函数SSL_connect( )替代传统的函数connect( )来完成握手过程:

? int SSL_connect(SSL *ssl);

? 而对服务器来讲,则应使用函数SSL_ accept ( )替代传统的函数accept ( )来完成握手过程:

? (7) 结束SSL通信

? 当客户端和服务器之间的数据通信完成之后,调用下面的函数来释放已经申请的SSL资源:

? int SSL_shutdown(SSL *ssl); ? //关闭SSL套接字

? void SSl_free(SSL *ssl);

第 11 页 共 21 页

? //释放SSL套接字

? void SSL_CTX_free(SSL_CTX *ctx); ? //释放SSL会话环境

4 FTP软件设计与实现

4.1 软件总体分析与设计

根据需求分析,按照系统开发的基本观点对功能进行分解,从功能上可对模块作如下划分:

1.连接管理模块:主要完成主机与服务器之间的连接与关闭操作。 2.文件管理模块:主要完成文件的显示、新建文件、删除文件等。 3.文件传输模块:主要完成主机与服务器连接成功以后文件的上传与下载。 4.辅助功能模块:主要是保存一些登录信息和一些简单的配置信息。

4.2 各模块具体设计

4.2.1 连接管理设计

该Ftp客户端工具用一个Winsocket连接上Ftp服务器,然后向其发送命令。在这个过程中,我们依靠发送——响应的机制。即发送Ftp命令——接收返回的响应信息——分析该信息——执行相关操作——发送下一条命令。在一般意义上,有一个socket用来连接Ftp服务器的相关端口(如默认的21),它负责Ftp命令的发送和接收返回的响应信息。一些操作如“进入目录”、“删除文件”,依靠这个socket发送一条命令就可完成了。

1.客户端与服务器连接

FTP是建立在TCP之上的连接,端口号使用21。若客户端与服务器之间成功连接,服务器将返回字符串,如:220 GMS (Version 5.0)。

前三个字符220表示客户端与服务器成功连接,后面的字符会因服务器的不同而不同,但我们只关心前三个字符。

2.用户名和密码认证

客户端发送用户名给服务器,如:USER he,如果服务器找到用户名he,将返回字符串,如:331 User name okay, need password。

接着客户端应发送密码给服务器,如:PASS 123,密码正确,返回如:230 User logged in, proceed,如果用户名或密码认证没有通过,返回如:530 Not logged in。

用户名也可以使用匿名,如:USER anonymous,返回如:331 Anonymous access allowed, send identity (e-mail name) as password。

3.应答码及其含义

110:重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK

第 12 页 共 21 页

yyyy=mmmm其中yyyy是用户进程标记,mmmm是服务器标记。

120:服务在nnn分钟内准备好。 125:数据连接已打开,准备传送。 150:文件状态良好,打开数据连接。 200:命令成功。 202:命令未实现。

211:系统状态或系统帮助响应。 212:目录状态。 213:文件状态。

214:帮助信息,信息仅对人类用户有用。 215:名字系统类型。 220:对新用户服务准备好。

221:服务关闭控制连接,可以退出登录。 225:数据连接打开,无传输正在进行。 226:关闭数据连接,请求的文件操作成功。 227:进入被动模式。 230:用户登录。

250:请求的文件操作完成。 257:创建“PATHNAME”。 331:用户名正确,需要口令。 332:登录时需要账户信息。

350:请求的文件操作需要进一步命令。 421:不能提供服务,关闭控制连接。 425:不能打开数据连接。 426:关闭连接,中止传输。 450:请求的文件操作未执行。 451:中止请求的操作:有本地错误。

452:未执行请求的操作:系统存储空间不足。 500:格式错误,命令不可识别。 501:参数语法错误。 502:命令未实现。 503:命令顺序错误。

504:此参数下的命令功能未实现。 530:未登录。

第 13 页 共 21 页

532:存储文件需要账户信息。 550:未执行请求的操作。 551:请求操作中止:页类型未知。

552:请求的文件操作中止,存储分配溢出。 553:未执行请求的操作:文件名不合法。 4.2.2 文件管理设计

文件管理具有文件的主要是新建文件夹、删除文件,使用DirectoryInfo类的Delete()方法和CreateDirectory()方法来实现。文件属性的设置包括:是否只读、是否隐藏、是否归档,用File类和Directory类来完成对文件和文件夹的属性设置。

4.2.3 文件加密设计

FTP协议用两个连接来达到客户机与服务器之间交换数据的目的如图3。先建立第一个连接——控制连接,它用于传送命令和响应。在建立第二个连接——数据连接,用于数据传输。FTP提供了两种方式来建立数据连接,一种用PORT命令,一种用PASV命令。我们使用后者。客户端发送PASV命令给服务器,服务器返回IP地址和端口号,用来提供给客户端进行数据连接。如:227 Entering Passive Mode (10,175,125,49,9,17)括号里6个数字中前4个数字表示IP地址10.175.125.49,后2个数字表示端口号,这2个数字按如下公式计算端口号:9*256+17=2321这样,客户端就可用IP地址10.175.125.49和端口号2321连接服务器,建立数据连接。

图3 文件传输中的处理过程

4.2.4 辅助功能设计

根据需求功能需要完成文件的上传及下载必须要完成一些相关的辅助功能:

第 14 页 共 21 页

1.获取本地主机的系统驱动器信息功能,需要在项目引用中添加COM标签中的Microsoft Scripting Runtime组件,来获取系统驱动器信息。

2.目录选择功能:在目录输入框中可以根据目录来显示所选定的文件夹下所有文件及文件夹信息,信息包括文件路径、文件创建日期、文件大小,利用GetFileSystemEntries()方法来完成。

3.信息保存功能:信息的保存利用读写INI文件来实现,INI文件读写操作由调用系统API函数来完成。具体调用WritePrivateProfileString()方法实现写入操作,用GetPrivateProfileString()方法实现读操作。

4.3 模块的程序实现

4.3.1 连接管理的程序实现

在用户打开软件后进入主窗体(MFFTP.cs),在连接服务器输入框中输入IP地址、用户名及密码后。先发送IP地址和端口号到服务器,然后对其应答分析,如果应答码为220表示对新用户服务准备好,继续发送用户名返回应答码331表示用户名正确需要口令。最后发送密码直到返回应答码230表示用户登录成功。其主要代码程序如下:

public void Connect() {

socketControl = new

Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp); IPEndPoint ep = new IPEndPoint(IPAddress.Parse(RemoteHost), strRemotePort); // 链接 try {

socketControl.Connect(ep); }

catch(Exception) {

throw new IOException(\ }

// 获取应答码 ReadReply();

if(iReplyCode != 220) {

DisConnect();

throw new IOException(strReply.Substring(4)); }

// 登录

SendCommand(\

if( !(iReplyCode == 331 || iReplyCode == 230) )

第 15 页 共 21 页

{

CloseSocketConnect();//关闭连接

throw new IOException(strReply.Substring(4)); }

if( iReplyCode != 230 ) {

SendCommand(\

if( !(iReplyCode == 230 || iReplyCode == 202) ) {

CloseSocketConnect();//关闭连接

throw new IOException(strReply.Substring(4)); } }

bConnected = true; // 切换到目录

ChDir(strRemotePath); }

4.3.2 文件管理的程序实现

对文件的管理有新建、删除、及属性设置。这里只对文件夹的删除操作做介绍,先实例化DirectoryInfo类并传入参数path,然后判断是文件还是文件夹用Delete()方法来删除文件。其主要代码程序如下:

private void MyDeleteFile(string path) {//删除本地文件 try {

if(path==null) return;

DirectoryInfo MyDir=new DirectoryInfo(path);

if(MessageBox.Show(\是否删除文件夹:\及其所有内容?\提示信息\ {

MyDir.Delete(true);

} else if(MessageBox.Show(\是否删除文件:\及其所有内容?\提示信息\ {

FileInfo fi=new FileInfo(path); fi.Delete(); } } catch

第 16 页 共 21 页

{

MessageBox.Show(\该文件不存在\信息提示\ } }

4.3.3 文件加密的程序实现

先进行判断是否与主机连接成功,获取要下载的文件名、保存到本机的路径、保存到本机时的文件名。在进行设置传输模式:二进制Binary传输或ACSII传输,在创建数据连接发送PASV被动模式进行传输然后对应答命令进行判断。最后进行数据传输以流方式传输。其主要代码程序如下:

public void Get(string strRemoteFileName,string strFolder,string strLocalFileName) {

if(!bConnected) {

Connect(); }

SetTransferType(TransferType.Binary); if (strLocalFileName.Equals(\ {

strLocalFileName = strRemoteFileName; }

if(!File.Exists(strLocalFileName)) {

Stream st = File.Create(strLocalFileName); st.Close(); }

FileStream output = new

FileStream(strFolder + \ Socket socketData = CreateDataSocket(); SendCommand(\ if(!(iReplyCode == 150 || iReplyCode == 125 || iReplyCode == 226 || iReplyCode == 250)) {

throw new IOException(strReply.Substring(4)); }

while(true) {

int iBytes = socketData.Receive(buffer, buffer.Length, 0); output.Write(buffer,0,iBytes); if(iBytes <= 0) {

第 17 页 共 21 页

}

break; } }

output.Close();

if (socketData.Connected) {

socketData.Close(); }

if(!(iReplyCode == 226 || iReplyCode == 250)) {

ReadReply();

if(!(iReplyCode == 226 || iReplyCode == 250)) {

throw new IOException(strReply.Substring(4)); } }

4.3.4 辅助功能的程序实现

当需要返回上级目录时,先检查当前目录字符串是否小于3,如果小于了3则表示已经是跟目录了,不能在返回上级目录了。其他情况直接用Substring来去掉最后一个目录。具体办法是每次取字符串从0到最后一个“\\\\”。然后把该字符串赋值给ComboBox。程序代码如下:其主要代码程序如下:

private void but_Fa_Click(object sender, System.EventArgs e) {//返回上级目录

string path=this.comboBox1.Text; string newpath;

if(path.EndsWith(\ {

if(path.Length<=3) {

MessageBox.Show(\根目录了!\系统提示\ return; }

newpath=path.Substring(0,path.LastIndexOf(\

this.comboBox1.Text=newpath.Substring(0,newpath.LastIndexOf(\ } else {

if(path.LastIndexOf(\ {

第 18 页 共 21 页

} }

newpath=path.Substring(0,path.LastIndexOf(\ this.comboBox1.Text=newpath; } else {

newpath=path.Substring(0,path.LastIndexOf(\ this.comboBox1.Text=newpath; return; }

当在第一次登录主机时,为方便以后在次登录该主机则需要保存其登录信息。先把所有的输入框中的值赋给有代表意思的字符串。如果主机别名为空则主机别名与主机地址相同。

然后通过IniWriteValue方法来写入mfftp.ini文件中,其主要代码程序如下:

private void but_Ok_Click(object sender, System.EventArgs e) {//添加登录主机信息

string hostname=this.text_Name.Text.Trim(); string hostip=this.text_SerIp.Text.Trim(); string loginname=this.loginName.Text.Trim(); string loginpwd=this.login_Pwd.Text.Trim(); string mydir=this.text_add.Text.Trim(); if(hostname==\ {

hostname=hostip; }

IniFile inf=new IniFile(); inf.path=\

int i=Convert.ToInt32(inf.IniReadValue(\ //string serAdd=inf.IniReadValue(\ string ServerName= \

inf.IniWriteValue(ServerName,\ inf.IniWriteValue(ServerName,\

inf.IniWriteValue(ServerName,\ inf.IniWriteValue(ServerName,\ inf.IniWriteValue(ServerName,\ i=i+1;

inf.IniWriteValue(\ this.standm.sername(hostname); this.Close();

第 19 页 共 21 页

4.3.5 ftp传输过程加密实现

当你在FTP服务器上收发文件的时候,你面临两个风险。第一个风险是在上载文件的时候为文件加密。第二个风险是,这些文件在你等待接收方下载的时候将停留在FTP服务器上,这时你如何保证这些文件的安全。你的第二个选择(创建一个支持SSL的FTP服务器)能够让你的主机使用一个FTPS连接上载这些文件。这包括使用一个在FTP协议下面的SSL层加密控制和数据通道。一种替代FTPS的协议是安全文件传输协议(SFTP)。这个协议使用SSH文件传输协议加密从客户机到服务器的FTP连接。

然而,你遇到的FTPS和SFTP的问题是,虽然这些文件安全地传送到了你的服务器,但是,这些文件一旦上载,访问这个服务器的任何人都可以看到这些文件,因为这些文件没有加密。因此,我建议你采用第一个解决方案,就是让你的主机使用接收方的公共PGP密钥为文件加密。这个选择不仅能够让文件在传输过程中保持加密状态,而且在文件停留在服务器上的时候只有指定的接收方才能解密和阅读文件。然而,你的问题的最佳的解决方案是把PGP加密加密文件与一个安全的FTP连接结合在一起。因为即使你的PGP加密的文件是安全的,如果你的主机使用不加密的FTP向你的服务器上载文件,用来访问这台服务器的用户名和口令就都是以不加密的方式传送的。攻击者可能窃取这些信息并且利用这种信息访问这台FTP服务器并且上载恶意文件或者删除现有的文件

5 软件测试

5.1 测试前分析

本FTP软件测试,从详细设计来看,分4部分进行测试:首先必须连接到

某网络,在网络连接成功后,进行第一步测试连接测试,在输入IP地址和登录名和密码后能成功连接到主机;第二步对文件操作测试,能新建文件、删除文件等操作;第三步在于服务器连接成功后测试上传和下载操作,第四步检测文件在选择目录后能显示根据路径来显示此路径下所有文件和信息保存入INI文件。

5.2 测试的过程与分析

第一步测试的是连接操作。连接一般有两种情况,一种是连接他是用户经常用要访问的FTP服务器,需要进行保存登录信息的。另一种是不常访问只是偶尔访问一下的只需要当次连接的是快速连接。连接前如下图4,输入IP地址为10.0.0.7(IP为本机地址);以及用户名密码为“anonymous”,连接成功后如图5。

第 20 页 共 21 页

登录前

图4登录服务器前

登录后

图5登录服务器后

第二步测试在文件或文件夹操作,进行了新建文件夹,删除文件和文件夹。对文件夹的属性设置即修改是否读写,是否隐藏、是否存档。都能成功的进行操作。

第三步测试文件上传和下载功能,以下载11.jpg为例下载前本地主机没有该文件如图6,当下载成功后主机这边显示有11.jpg文件出来在本地主机上如图7。

第 21 页 共 21 页

下载前

图6下载前目录下所有文件

下载成功后

图7下载后目录下所有文件

第四步只要测试了对主机登录信息的保存,是否成功读写INI文件。都能成功的进行读写操作。

5.3 测试小结

通过以上的测试可以出来,该软件实现了服务器的连接操作。能完成新建文件、删除文件以及文件的上传和下载等操作。由于对断点续传过程用程序设计未能全部了解,所以未完成该功能。还有就是在获取系统驱动器时未能筛选掉软驱磁盘和光驱磁盘。希望如果有人继续开发能完成这里。

第 22 页 共 21 页

结 论

此次FTP软件的设计与开发,从其功能上讲没有任何新的功能。实现了FTP的基本功能。能获取系统驱动器信息,能根据路径来显示你文件夹信息。能在软件中对文件进行添加和删除操作,及文件的上传和下载操作。能将登录名和密码保存到INI文件中去。能根据别名读取INI,新建连接能写入INI文件中去,外观基本上算是比较美观。完成了基本的FTP软件功能。FTP下载软件开发不管是在国内外都已经了十分成熟的技术,功能都比较齐全和不错。但是此次毕业设计的对我的最大收获是了解了VC++开发Windows应用程序开发,对新的开发语言VC++有了了解。对FTP工作过程也有了一定的了解。也可以给一些初学FTP客户端软件开发一些帮助。

第 23 页 共 21 页

参考文献

[1] TOM Archer[美].VC++技术内幕[M].候晓霞,柴洪辉[译].北京:清华大学出版社,2002。 [2] 微软公司[美].MCAD/MCSD制胜宝典用Visual BasicVC++和Visual VC++VC++开发Windows应用程序[M].郑宇红,徐泓[译].北京:清华大学出版社,2003。 [3] 吴财军.VC++经典范例50讲[M].北京:北京希望电子出版社,2003。

[4] 罗斌.Visual VC++VC++精彩编程实例集锦[M].北京:中国水利水电出版社,2005。 [5] W.Richard Stevens[美].TCP/IP详解卷1:协议[M].范建华,胥光辉,张涛[译].北京:机械工业出版社,2005。

[6] 李勇平,陈峰波.ASPVC++(VC++)基础教程[M].北京:清华大学出版社,2006。 [7] Xin Chen[美].应用框架的设计与实现-VC++平台[M].温昱,靳向阳[译].北京:电子工业出版社,2005。

致 谢

首先怀着诚挚的敬意感谢我的老师钱伟中老师。在毕业设计过程中和论文撰写过程中钱老师给予了耐心细致的指导。钱老师的严格要求和期望是我进步的动力之一;他严谨的治学态度、实事求是的工作作风、永无止境的学习精神已成为我学习和工作中的表率。钱老师对教育学生所表现出的巨大责任心更是我今后工作生活的一个榜样。

他们在毕业设计和学习生活上给予了很大指导和帮助。另外还要感谢学校诸多老师,他们的课程和切身指导无论在专业还是生活态度上对我都产生了积极而重要影响。

感谢在一起学习、生活的同班的同学,有了他们的关心和帮助我才能顺利地完成本论文的内容,他们等。

最后,还要感谢我的父母和家人,他们是我温暖的港湾。这些年我在学业上能有点收获,是与他们给予我的关怀、鼓励和支持分不开

第 24 页 共 21 页

本文来源:https://www.bwwdw.com/article/chj.html

Top