FTP客户端系统设计 .doc_第1页
FTP客户端系统设计 .doc_第2页
FTP客户端系统设计 .doc_第3页
FTP客户端系统设计 .doc_第4页
FTP客户端系统设计 .doc_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

FTP客户端系统设计 (2)河北经贸大学毕业论文FTP客户端系统设计专业名称: 计算机科学与技术 班 级: 学生姓名: 指导教师: 完成日期: 河北经贸大学毕业论文摘要当今时代是一个信息化高速发展的时代,越来越多的网络爱好者需要对信息进行收集、传送和发布等工作。FTP就是为了满足人类的这一需要而产生的。它具有安全性高,操作容易,功能强大等优点。它的出现极大改善了我们的应用环境,也极大提高了我们的工作效率,方便了我们对网络资源的获得与供给。在本文中,首先分析了FTP协议,给出了FTP的基本概念、工作原理和流程。然后介绍了WinSock在网络编程方面的应用,给出了有关WinSock API MFC封装类CAsyncSocket和Csocket的技术特点和编程模型。最后,说明了FTP客户端程序有关的连接服务器、获取文件目录、下载文件等功能模块和关键代码。关键词: FTP;WinSock;VC+AbstractInformation is developing with high speed today. More and more network fanciers need to do information gathering, transferring and dispatching, So FTP software is designed just for those purposes. FTP has its great advantages of high-security, easy-operation and powerful-function etc. FTP comes to improve our application condition and the work efficiency. FTP also facilitates the networks resource demand and supply. In this paper, the author starts of analysis of FTP protocol, gives basic concept of FTP, work theory and flow. Then, this paper discusses the application of Winsock at the network programming, and gives the technological attributes and programming model of CAsyncSocket and CSocket encapsuled by Winsock Api MFC. It finally demonstrates the connect server module, get file direction module and download file module, also offers key source codes.Keywords:ftp;Winsock;VC+iv目录前言11 FTP协议分析21.1 什么是FTP21.2FTP基本概念21.2.1连接21.2.2传输模式41.2.3工作模式61.2.4 FTP应答61.2.5状态图71.3典型FTP过程102 Winsock网络编程122.1相关概念122.2 WinSock APIMFC封装类142.2.1CAsyncSocket的编程模型162.2.2 CSocket类编程模型(只使用于数据流套接字)173具体设计193.1封装FtpClient类193.1.1CftpClient类定义193.1.2接收消息203.1.3发送消息203.1.4登录服务器213.1.5发送FTP命令213.2功能模块分析223.2.1登录参数设定223.2.2获得服务器目录信息263.2.3下载文件283.3运行分析32结束语34致谢35参考文献36河北经贸大学毕业论文前言随着科学技术的不断提高,计算机网络日渐成熟,其强大的功能已为人们深刻认识。它也越来越多的渗透到我们的学习生活中,收发电子邮件、召开网络会议、诸多软件下载、网络电话的使用等,它以其快速、方便、灵活、全面、相对价位低廉的特点进入人类社会生活的各个领域,并发挥着越来越重要的作用。对于每一位网络用户来说,在网络中获取信息,或者有好的信息想与大家共享,那么上传、下载文件就是不可避免的了。因此FTP是不可或缺的,它为用户提供的应用,无论是对服务器端还是用户端都非常重要。所以,所开发的FTP应该能够给服务器端和用户端功能强大并方便的使用。软件FTP是我们所学知识与实际应用的一个很好结合。它的设计思想:首先,要基于Windows,毕竟Windows用户众多,并与所学知识挂钩,以原有知识为起点,不断提高;其次,界面简单、明朗,让人一目了然,适合不同文化层次不同人群的需要;再次,代码填写要实际,也就是要写一些非常有用的代码,切实可行的,功能强大的,还要有保密性;最后,有一篇概括整个过程和开发方法的论文,真正实现理论联系实践,适应高等教育的改革和发展。在实际中,可能进行FTP服务器开发的机会较少,大部分重点在客户端,因此,开发了一个很小的FTP服务器,客户端的开发则实现了其基本功能。我们的客户端功能包括:可以实现用户登录;获取服务器文件列表;浏览客户端文件列表;上传文件;下载文件。这个FTP软件是基于VC+语言编写的,并调试通过,主要用到了Windows Sockets 、MFC、网络知识和FTP基本原理等。1 FTP协议分析1.1 什么是FTPFTP是文件传送协议的缩写(File Transfer Protocol),是在Internet上各种不同的计算机之间按照TCP/IP协议来传输文件。它的作用是把文件从一个计算机转移到另一个计算机,采用的是现在流行的C/S(客户/服务器)模式,由FTP客户端程序和FTP服务器端程序组成。通常服务器端是远程站点,用户可以通过Internet网络连接到远程的FTP服务器站点。当启动FTP从远程计算机拷贝文件时,也就是启动了两个程序,本地机上的FTP客户程序:它提出拷贝文件的请求;运行在远程计算机上的FTP服务器程序,它响应您的请求把您指定的文件传送到您的计算机。当用户使用FTP客户端程序访问远程服务器时,首先要在本地计算机启动FTP的客户端程序,然后向远程服务器发出请求。一旦远程计算机响应并实现连接,就在两台计算机之间建立一条临时通路,借以执行会话命令和传输文件。在用户完成文件传送操作后,对服务器发出解除连接的请求,结束整个FTP会话过程。FTP用户和服务器凭借FTP进行的全部会话(通信活动),都是依靠TCP/IP协议进行的。对于不采用TCP/IP的系统,可以通过协议转换软件解决信息传输问题。因此,在Internet上使用FTP传输文件时不受系统类型的限制。1.2FTP基本概念1.2.1连接默认数据连接端口:所有FTP必须支持默认数据连接,只有用户PI能够初始化非默认端口的使用。确定非默认数据端口:用户PI可以使用PORT命令指定非默认端口,它要求服务器方以PASV确定非默认数据端口。连接是由双方地址确定的,因此改变一方地址就改变了连接。数据连接的重用:在使用流式数据传输模型时,文件结束通过关闭连接指示。如果要传送多个文件时就会出麻烦,解决的方法有两个,一个是确定非默认端口,另一个是使用另一种传输模式。就传输模式而言,流传输模式是不安全的,因此无法确定连接是暂时还是永久关闭。其它传输模式不通过关闭连接表示文件结构,它们可以通过FTP命令决定传送结构。因此使用这些传输模式可以在保持连接的情况下传送多个文件。服务器协议解释器会在端口L帧听,用户或用户协议解释器初始化全双工控制连接,服务器和用户进程应该遵守Telnet协议的说明进行。服务器不提供对命令行的编辑功能,应该由用户负责这一切。在全部传送和应答结束后,在用户的请求下服务器关闭控制连接。用户DTP必须在指定的数据端口上帧听,它可以是默认端口U或由PORT命令指定的端口。服务器的默认数据端口为L-1。传输方向和端口均可由FTP命令决定。只有用户PI可以改变默认端口。当数据在服务器A和B之间传送时,用户PI,C,在两个服务器PI之间建立控制连接。其中一个服务器A,在接收到传输服务命令时接收PASV命令初始化连接,用户PI接收到PASV命令的确认时(确认内包括主机标识和端口),将端口以PORT命令发送到B。在接收到确认后,用户PI可以发送相应的命令给A和B了,B初始连接和传输进程,命令应答序列如下图所示: 图 1-1在任何时间,服务器和用户只要有一方关闭连接,另一方就要赶快读取缓冲中的数据,然后也关闭本方的连接。1.2.2传输模式有三种传输模式:一种将数据格式化并考虑重新开始过程;一种压缩数据;一种是不经过处理(少量处理)传送。为了进行标准化传送,传送主机必须把行结束或记录结束的内部表示转化为传输模式和文件结构指定的形式传送,接收方则进行相反的工作。下面是FTP定义的传输模式:流模式:数据以字节流的形式传送。使用的表示类型没有限制,允许记录结构在记录结构文件EOR和EOF表示为双字节控制码。第一字节全为0,后一字节为转义字符。当第二位值为1时表示EOR,为2时表示EOF,如果要同时表示EOR和EOF,值为3。全1字节作为数据发送时必须使用双字节传送,其中数据保存在第二个字节内。如果是文件结构,通过发送方关闭连接表示EOF,接收到的所有数据就是文件内容。块模式:文件以块形式传送,块带有自己的头部分。头字节包括计数域和描述子代码。计数域说明了数据块的字节数,描述子代码定义了以下内容:EOF,EOR重新开始标记或怀疑错误数据。怀疑错误数据不是为了进行差错控制,它是为了站点间交换特定数据,传送时不管本地错误(如硬盘错误)而只管传送,但是传送时可要指出,这个数据可能有错。在此模式下可以使用记录结构,也可以使用相应的数据表示。头字节的结构如图1-1所示: 描述子 8位字节计数 16位 图1-2描述子代码由在描述子字节中的位标记说明,下面是已经指定的四种代码及其意义:代码意义128数据块结束是EOR64数据块结束是EOF32数据块内有怀疑错误16数据块是重新开始标记 图1-3压缩模式:有三种信息需要传送:常规数据以字节串传送;压缩数据,包括复本和过滤器;控制信息,以两个转义字符传送。如果有N(0但小于127)个常规数据传送,在数据前一位加上一个字节,这个字节最高位为0,其它位表示的数值等于N。如下图: 图 1-4若要压缩一个数据位D的N复本字符串,用两个字节传送,如下图,它表示的是压缩的字节: 图 1-5一串N过滤器字节可以压缩为一个字节,而过滤器字节根据表示法不同而不同。如果类型是ASCII或EBCDIC,过滤器字节是,如果是图像或本地类型,则是0。下面就是过滤器字节: 图 1-6转义序列是双字节,头一个全0,后一个是定义于块模式下的描述子代码。描述子代码与块模式中的意义相同,它作用于其后串中的字节。而压缩模式对于增加带宽有好处(因为数据是压缩过的)。1.2.3工作模式FTP支持两种模式,一种叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTPserver。Passive模式FTP的客户端发送 PASV命令到 FTP Server。Standard模式FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。 Passive模式在建立控制通道的时候和Standard模式类似,当客户端通过这个通道发送PASV 命令的时候,FTP server打开一个位于1024和5000之间的随机端口并且通知客户端在这个端口上传送数据的请求,然后FTP server 将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。注意,PORT模式建立数据传输通道是由服务器端发起的;在PASV模式中,数据传输的通道的建立是由FTP客户端发起的,他使用一个大于1024的端口连接服务器的1024以上的某一个端口。如果从C/S模型这个角度来说,PORT对于服务器来说是OUTBOUND,而PASV模式对于服务器是INBOUND。最后,请注意在FTP客户连接服务器的整个过程中,控制信道是一直保持连接的,而数据传输通道是临时建立的。1.2.4 FTP应答FTP命令的响应是为了对数据传输请求和过程进行同步,也是为了让用户了解服务器的状态。每个命令必须有最少一个响应,如果是多个,它们要易于区别。有些命令是有顺序性的,因此其中任何一个命令的失败会导致从头开始。FTP响应由三个数字构成,后面是一些文本。数字带有足够的信息命名用户PI不用检查文本就知道发生了什么。文本信息与服务器相关,用户可能得到不同的文本信息。文本和数字以间隔,文本后以Telnet行结束符结束。文本可能多于一行,这时文本必须在括号内,第一行内要有信息表示文本多于一行,最后一行也要有所标记。如果是多行,可以在数字代码后加上-,最后一行以数字开始,后面是,再加上Telnet的行结束符就可以了。1.2.5状态图下面是一个简单实现的FTP的状态图,只用到响应码的首位。对于所有命令或命令序列有三种可能性:成功(S),失败(F)或错误(E)。在状态图中B代表开始,W代表等待响应。下面给出一个总图,总图可以包括的命令有:ABOR,ALLO,DELE,CWD,CDUP,SMNT,HELP,MODE,NOOP,PASV,QUIT,SITE,PORT,SYST,STAT,RMD,MKD,PWD,STRU和TYPE 图 1-8下图可以包括的命令有:APPE,LIST,NLST,REIN,RETR,STOR和STOU。 图 1-9第一幅图和第二幅图差别不大,第一幅图中如果出现了100系列响应会是错误,而在第二幅图中不会。下面是重命名过程: 图 1-10下面是重新启动命令,其中cmd代表APPE,STOR或RETR。 图 1-11下图代表登录过程: 图 1-121.3典型FTP过程假设位于U的用户希望从S上(下)传文件,通常用户需要使用用户FTP进程和服务器通信,FTP控制连接通过用户进程端口U和服务器端口L建立,这里默认的L=21。下面就是一个例子:表 1-1用户发出的本地命令解释ftp (host) multics连接到S的端口L,建立控制连接- 220 Service ready .用户名 Doe need password.USER Doe- 331 用户名正确口令 PASS 口令- 230 User logged in.retrieve (local type) ASCII(local pathname) test 1 (for. pathname) test.pl1User-FTP opens local file in ASCII.RETR test.pl1 - 150 文件状态正常,将打开数据连接服务器于端口U建立数据连接文件传输中- 226 关闭数据连接,文件传输正确type ImageTYPE I - 200 Command OKstore (local type) image(local pathname) file dump(for.pathname) uddcnfdUser-FTP opens local file in Image.STOR uddcnfd - 550 访问拒绝中止QUIT -服务器关闭所有连接 2 Winsock网络编程Windows Sockets定义了Windows的网络编程接口,它基于加利福尼亚大学伯克利分校的伯克利Unix Sockets。Windows Sockets它不仅包含了人们熟悉的Berkeley Sockets 风格的库函数,还加入了针对Windows的扩展库函数,例如用于消息驱动的扩展函数,以使程序员能充分利用Windows消息驱动机制进行编程。Windows Sockets是Windows下得到广泛应用的、开放的、支持包括TCP/IP、XNS、DECNet、IPX/SPX 等多种协议的网络编程接口。在Win32环境下,Windows Sockets提供线程安全。通过微软与标准组织的努力,为WinSock定义了应用程序设计接口(WinSock API),可以非常方便地利用下层的网络协议(如TCP/IP) 进行网络通讯。Windows Sockets规范的本意是在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。2.1相关概念(1)套接字 (Sockets)套接字是通讯的基石,是支持TCP/IP协议的网络通信的基本操作单元。可以将套接字看作不同主机间的进程进行双向通信的端点。一个套接字是通讯的一端。在这一端上你可以找到与其对应的一个名字。一个正在被使用的套接字都有它的类型和与其相关的进程。套接字存在于通讯域中。通讯域是为了处理一般的线程通过套接口通讯而引进的一种抽象概念。套接字通常和同一个域中的套接字交换数据(数据交换也可能穿越域的界限,但这时一定要执行某种解释程序)。Windows Sockets规范支持单一的通讯域,即Internet域。各种进程使用这个域互相之间用Internet协议族来进行通讯。套接口可以根据通讯性质分类,即流套接字和数据报套接字。流套接字,提供了双向的,有序的,无重复并且无记录边界的数据流服务。是面向连接的;数据报套接字,支持双向的数据流,但并不保证是可靠,有序,无重复的。是无连接的。(2)带外数据也称TCP紧急数据,它是相连的每一对流套接字间一个逻辑上独立的传输通道。带外数据是独立于普通数据传送给用户的,这要求带外数据设备必须支持每一时刻至少一个带外数据消息被可靠地传送。(3)广播数据报套接字可以用来向许多系统支持的网络发送广播数据包。要实现这种功能,网络本身必须支持广播功能。广播通常是为了如下两个原因而使用的,一个应用程序希望在本地网络中找到一个资源,而应用程序对该资源的地址又没有任何先验的知识;一些重要的功能,例如路由要求把它们的信息发送给所有可以找到的邻机。(4)阻塞和非阻塞套接字可以处于阻塞和非阻塞模式。调用任何一个阻塞模式的函数,都会产生相同的后果耗费或长或短的时间等待操作的完成。(5)客户机/服务器模型一个在建立分布式应用时最常用的范例便是客户机/服务器模型。在这种方案中客户应用程序向服务器程序请求服务。这种方式隐含了在建立客户机/服务器间通讯时的非对称性。客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。这一套惯例包含了一套协议。它必须在通讯的两头都被实现。根据不同的实际情况,协议可能是对称的或是非对称的。在对称的协议中,每一方都有可能扮演主从角色;在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。在这个时刻,服务程序被“唤醒”并且为客户提供服务对客户的请求作出适当的反应。(6)字节顺序不同的计算机有时使用不同的字节顺序存储数据。任何从Windows Sockets函数对IP地址和端口号的引用和传送给Windows Sockets函数的IP地址和端口号均是按照网络顺序组织的。一个应用程序通常用与“时间”服务对应的端口来和服务器连接,而服务器提供某种机制来通知用户使用另一端口。因此网络顺序要和端口号能够互相转换。2.2 WinSock APIMFC封装类 VC通过提供两个类CAsyncSocket和CSocket,MFC支持使用WinSock API通讯程序设计。MFC把复杂的WinSock API封装到类里, 这使得编写应用程序更容易。CAsyncSocket类逐个封装了WinSock API,为高级网络程序员提供了更加有力而灵活的方法。CAsyncSocket类所提供的唯一的抽象就是将与套接字相联系的Windows消息以回调函数的形式表示,因此它所带来的唯一方便就是我们无需自行处理Winsock的I/O模型,而对如阻塞处理、字节排序差异以及在Unicode与MBCS间转换字符等依然负有责任与灵活的控制权。的任务。为了给程序员提供更方便的接口以自动处理这些任务,MFC给出了CSocket 类,这个类是由CAsyncSocket类继承下来的,它提供了比CAsyncSocket更高层的WinSock API 接口。Csocket类和CsocketFile 类与Carchive 类一起合作来管理发送和接收的数据,这使管理数据收发更加便利。CSocket 类是由CAsyncSocket继承而来的,CSocket类是CAsyncSocket的派生类,继承了它封装的WinSock API。一个CSocket对象代表了一个比CAsyncSocket对象更高层次的Windows Socket抽象,CSocket类与CSocketFile类和CArchive类一起工作来发送和接收数据,因此使用它更加容易。CSocket对象提供阻塞模式,因为阻塞功能对于CArchive的同步操作是至关重要的。因为此套接字的阻塞函数在完成操作返回之前什么也不能做。如果一个socket处于非阻塞模式(即异步操作),则会被调用函数立即返回。在CAsyncSocket 类中可以用GetLastError成员函数查询最后的错误,如果错误是WSAEWOULDBLOCK则说明有阻塞,而CSocket绝不会返回WSAEWOULDBLOCK,因为它自己管理阻塞。微软建议尽量使用非阻塞模式,通过网络事件的发生而通知应用程序进行相应的处理。但在CSocket 类中,为了利用CArchive处理通讯中的许多问题和简化编程,它的一些成员函数总是具有阻塞性质的,这是因为CArchive类需要同步的操作。阻塞函数,比如Receive()、Send()、ReceiveFrom()、SendTo() 和Accept()直到操作完成后才返回控制权,因此如果需要低层控制和高效率,就使用CasyncSock类;如果需要更方便,则可使用Csocket类。在Win32环境下,如果要使用具有阻塞性质的套接字,应该放在独立的工人线程中处理,利用多线程的方法使阻塞不至于干扰其他线程,也不会把CPU时间浪费在阻塞上。多线程的方法既可以使程序员享受CSocket带来的简化编程的便利,也不会影响用户界面对用户的反应。CSocket对象和串行化技术共同使用CSocket与CArchive对象是最简单的套接字编程模型,其中CArchive对象将帮助我们处理许多以前必须使用API或CAsyncSocket类来处理的通信问题,大大减少了工作量。客户服务器发送数据网络接收数据CArchive CSocketFile CSocketCArchive CSocketFile CSocketCArchive CSocketFile CSocketCArchive CSocketFile CSocket接收数据网络发送数据 对于套接字来说,归档对象是与CSocketFile对象相关的,CSocketFile对象连接到一个CSocket对象。一个CArchive对象将负责管理一个缓冲区。当storing归档对象的缓冲区被添满时,相关的CSocketFile对象将缓冲区的内容取出,清空与套接字相关的归档缓冲区与发送消息等价。 图 2-1 CSocket、CSocketFile、CArchive对象之间关系2.2.1CAsyncSocket的编程模型(1)构造一个CAsyncSocket对象,并用这个对象的Create成员函数产生一个Socket句柄。可以按如下两种方法构造:CAsyncSocket sock;Sock.Create(); /使用默认参数产生一个字节流套接字 或CAsyncSocket*pSocket = new CAsyncSocket;int nPort=27;pSocket-Create(nPort, SOCK-DGRAM);/指定端口号产生一个数据报套接字第一种方法在栈上产生一个CAsyncSocket对象,而第二种方法在堆上产生CAsyncSocket对象。第一种Create成员函数用缺省参数产生一个字节流套接字,第二种Create 成员函数用指定的端口和地址产生一个数 字报套接字。Create的参数有: 端口,UINT类型。注意:如果是服务方,则使用一个众所周知的端口供服务方连接;如果是客户方,典型做法是接受默认参数,使套接字可以自主选择一个可用端口;-socket类型。SOCK-STREAM(默认值)或SOCK-DGRAM;-socket地址。例如“”或“3”。(2)如是客户方程序,用CAsyncSocketConnect成员函数连接到服务方;如是服务方程序,用CAsyncSocketListen成员函数开始监听,一旦收到连接请求,则调用CAsyncSocketAccept成员函数开始接收。注意:CAsyncSocketAccept成员函数要用一个新的并且是空的CSocket对象作为它的参数,这里所说的“空的”指的是这个新对象还没有调用Create成员函数。(3) 调用CAsyncSocket对象的其他成员函数,完成执行与其他套接字的通信和其他操作。(4)通讯结束后,销毁CAsyncSocket对象。如果是在栈上产生的CAsyncSocket对象,则对象超出定义的范围时自动被析构;如果是在堆上产生,也就是用了new这个操作符,则必须使用delete操作符销毁CAsyncSocket对象。2.2.2 CSocket类编程模型(只使用于数据流套接字)(1)分别构造服务器和客户套接字对象。(2)使用这个对象的Create成员函数产生一个socket句柄。在客户方程序中,除非需要数据报套接字,Create一般情况下应该使用默认参数。而对于服务方程序,必须在调用Create时指定一个端口。注意:CArchive不能与数据报(UDP)套接字一起工作,因此对于数据报套接字,CAsyncSocket和CSocket的使用方法是一样的。Create函数会调用Bind函数将此套接字绑定到指定的地址。需注意的是为服务器创建套接字时需要为其指定端口号。(3)如果是客户方套接字,则调用CAsyncSocketConnect()与服务方套接字连接;如果是服务方套接字,则调用CAsyncSocketListen()开始监听来自客户方的连接请求,收到连接请求后,调用CAsyncSocketAccept()接受请求,建立连接。(4)套接字创建完毕后,服务器调用Listen成员函数开始侦听客户的连接请求,而客户可以调用Connect成员函数向服务器请求连接。(5)当服务器监听到客户连接请求时,创建一个新的套接字,并将其传给Accept成员函数以接收客户的连接请求,函数执行失败会返回特定的错误码。(6)为服务器和客户的套接字对象分别创建一个与之相联系的CSocketFile对象。(7)为服务器和客户的套接字对象分别创建一个与CSocketFile相联系的CArchive对象以进行数据的发送和接收。(8)使用CArchive对象在客户和服务器套接字之间传送数据。(9)在任务执行完成后,销毁CArchive、CSocketFile和CSocket对象。服务器客户CSocket sockSvrsockSvr.Create(nPort)sockSvr.Listen()CSocket sockRecv;sockSvr.Accept(sockRecv)CSocketFile file(&sockRecv)Carchive arIn(&file,CArchive:load);Carchive arOut(&file,CArchive:store);ArIndw Value或ArOutdw ValueCSocket sockClient;SockClient.Create()SockClient.Connect(strAddr,nPort)CSocketFile file(&sockClent)Carchive arIn(&file,CArchive:load);Carchive arOut(&file,CArchive:store);ArIndw Value或ArOutdw Value连接请求传送数据图 2-2 CSocket类编程模型3具体设计3.1封装FtpClient类3.1.1CftpClient类定义FtpClient类封装了所有必要的套节字操作和FTP底层协议,定义如下:class CFTPClient protected:BOOL ReadStr2();int ReadStr();BOOL WriteStr(CString outputstring);BOOL ConnectRemote(CString serverhost,int serverport);CArchive*m_pCtrlRxarch;CArchive*m_pCtrlTxarch;CSocketFile*m_pCtrlsokfile;CFTPSocket*m_Ctrlsok;int m_fc;CString m_retmsg;CByteArray m_buf;CString m_strLine;public:CMessageDlg m_dlgMsg;Disconnect();BOOL MoveFile(CString remotefile, CString localfile,BOOL get,BOOL pasv = FALSE);BOOL List();BOOL FTPcommand(CString command);BOOL Logon(CString hostname,int hostport,CString username, CString password, CString acct, CString fwhost,CString fwusername, CString fwpassword,int fwport,int logontype);void Receive();CFTPClient(CSFTPDoc *pDoc);virtual CFTPClient();protected:BOOL GetLine(int& ndx);void ProcessList();CSFTPDoc* m_pDoc;3.1.2接收消息int CFTPClient:ReadStr()int retcode;if(!ReadStr2()return FALSE;if(m_retmsg.GetLength() 3 & (m_retmsg.GetAt(3) = & atol(m_retmsg) = retcode) return TRUE;if(!ReadStr2() return FALSE;3.1.3发送消息BOOL CFTPClient:WriteStr(CString outputstring)TRY m_pCtrlTxarch-WriteString(outputstring+rn);m_pCtrlTxarch-Flush();CATCH(CException,e) return FALSE;END_CATCHreturn TRUE;3.1.4登录服务器BOOL CFTPClient:ConnectRemote(CString serverhost, int serverport)SAFEDELTE(m_pCtrlRxarch);SAFEDELTE(m_pCtrlTxarch);SAFEDELTE(m_pCtrlsokfile);SAFEDELTE(m_Ctrlsok);if(m_Ctrlsok = NULL)m_Ctrlsok = new CFTPSocket;if( !(m_Ctrlsok-Create() )return FALSE;if(!(m_Ctrlsok-Connect(serverhost,serverport) return FALSE;if(!(m_pCtrlsokfile=new CSocketFile(m_Ctrlsok) return FALSE;if(!(m_pCtrlRxarch=new CArchive(m_pCtrlsokfile,CArchive:load) return FALSE;if(!(m_pCtrlTxarch= new CArchive(m_pCtrlsokfile,CArchive:store)return FALSE;return TRUE;3.1.5发送FTP命令BOOL CFTPClient:FTPcommand(CString command)if(command != & !WriteStr(command)return FALSE;if(!ReadStr() | (m_fc != 2) return FALSE;return TRUE;3.2功能模块分析3.2.1登录参数设定(1)界面图31服务器参数对话框(2)功能分析不同用户根据不同情况选择登录方式。程序中列举了多种,本例实现的是通过用户名和密码的方式登录。选择登录类型后,确定要连接的端口,默认是21,因此,用户不输入则使用21,有的服务器为了安全,会改变默认端口,这时,就需要设定和服务器端侦听一致的端口。由于FTP连接是通过两个通道数据通道和命令通道进行的,因此,在连接服务器时,为了能接受到服务器传来的命令,必须首先打开命令通道,使用函数OpenControlChannel。在此函数中,主要首先创建socket,然后调用socket的connect函数连接服务器,并通过CsocketFile、Carchive两个函数把创建socket联系起来,这样命令的发送和服务器信息的接收,就可以通过这两个类进行了。调用函数FTPcommand(“”)发送一个空命令到服务器进行初始化工作。函数FTPCommand主要是传递客户端发送的命令,并进行简单的判断。该函数中另外使用了两个重要函数WriteStr和ReadStr。函数FTPCommand主要是传递命令到函数WriteStr,该函数才是真正进行网络传播的;ReadStr函数主要是读取服务器返回的数据。ReadStr函数主要是读取服务器返回的数据。通过ReadStr的服务器端的返回值,判断登录是否成功。(3)流程图选择登录方式查看端口打开命令通道初始化服务器图3-2登录流程(4)代码BOOL CFTPClient:Logon(CString hostname, int hostport, CString username, CString password, CString acct, CString fwhost, CString fwusername, CString fwpassword, int fwport, int logontype)if(m_dlgMsg.m_hWnd = NULL)m_dlgMsg.Create(AfxGetMainWnd();elsem_dlgMsg.ShowWindow(SW_SHOW);int port,logonpoint=0;const int LO=-2, ER=-1;CString buf,temp;const int NUMLOGIN=9; / currently supports 9 different login sequencesint logonseqNUMLOGIN100 = /* this array stores all of the logon sequences for the various firewalls in blocks of 3 nums. 1st num is command to send, 2nd num is next point in logon sequence array if 200 series response is recd from server as the result of the command, 3rd num is next point in logon sequence if 300 series recd */0,LO,3, 1,LO,6, 2,LO,ER,/ no firewall3,6,3, 4,6,ER, 5,ER,9, 0,LO,12, 1,LO,15, 2,LO,ER, / SITE hostname3,6,3, 4,6,ER, 6,LO,9, 1,LO,12, 2,LO,ER,/ USER after logon7,3,3, 0,LO,6, 1,LO,9, 2,LO,ER,/proxy OPEN3,6,3, 4,6,ER, 0,LO,9, 1,LO,12, 2,LO,ER,/ Transparent6,LO,3, 1,LO,6, 2,LO,ER,/ USER with no logon8,6,3, 4,6,ER, 0,LO,9, 1,LO,12, 2,LO,ER,/USER fireIDremotehost9,ER,3, 1,LO,6, 2,LO,ER,/USER remoteIDremotehost fireID10,LO,3, 11,LO,6, 2,LO,ER/ USER remoteIDfireIDremotehost;if(logontyp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论