? //释放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 页