当前位置:文档之家› 基于WINSOCK的FTP客户端的实现

基于WINSOCK的FTP客户端的实现

基于Winsock的FTP客户端的实现目录一、课程设计基本要求 (2)课程设计目的 (2)课程设计任务 (2)课程设计要求 (2)二、程序简介 (2)开发环境 (2)程序界面 (3)三、原理概述 (4)FTP协议 (4)应用WinSock实现网络通信 (5)四、主要数据结构 (6)五、CFTPClient类 (8)控制连接的实现 (8)数据连接的实现 (11)六、体会 (13)一、课程设计基本要求●课程设计目的1 加深对TCP/IP协议的理解。

2 了解FTP协议的工作原理。

3 掌握用MFC编写FTP协议的实现程序。

●课程设计任务在Visual C++6.0的环境下实现FTP下载工具。

●课程设计要求1 了解FTP协议的工作原理。

(RFC765 , RFC2228, RFC2640, RFC2773)2 主要是基于TCP/IP的Winsock编程,用Visual C++6.0实现一个基于FTP协议的FTP下载工具(客户端)。

二、程序简介●开发环境操作系统:Microsoft Windows XP pro编译环境:Microsoft Visual C++ 6.0CPU:PM-1.7GHz内存:768MB硬盘:40MB分辨率:32bit 1024×768 程序界面三、原理概述FTP协议FTP是Internet上基于TCP/IP协议传输文件的应用层协议。

FTP规定了数据包的格式、数据包头部结构和命令结构等等。

FTP应用命令行方式传输文件。

FTP在RFC959中定义。

FTP应用TCP传输而不是UDP。

由FTP提供的文件传输是将一个完整的文件从一个系统复制到另一个系统中。

应用FTP首先需要登录FTP服务器,或者通过允许匿名FTP来使用FTP服务器。

FTP最早的设计是用于两台不同的主机即不同的操作系统下,不同的文件结构,不同的字符集。

FTP是建立两个TCP连接(见图) ,一个用于传输数据,另一个用于传输命令。

每个FTP主机都有一个“协议解析器”( Pr ot oco1 I nter p reter, PI )模块,负责解释并执行FTP命令和响应。

同时,每个FTP主机还有一个“FTP数据传送”( FTPData Transfer,D T)模块,负责处理数据。

FTP通过执行“Telnet”(虚拟终端)模块或通过完全重新实施Telnet 作为“协议解析器”。

FTP命令以纯文本形式发送,其响应同样也是纯文本形式,并在三位数字后跟某些文本。

这些数字可由软件用来确定下面要采取的步骤。

而文本则供用户阅读。

每一个命令都会产生一个或多个响应。

应用WinSock实现网络通信WinSock是Microsoft等公司联合开发的网络编程接口,其实是一种进程间相互通信的机制,并将这种进程间通信从单机环境扩展到网络环境,适合于开发主机/客户机通信程序。

网络通信包括两台主机或者两个进程通过网络传递数据,网络的每一端称为一个端点,而WinSock为网络端点的抽象表示。

当用其编程时,程序在网络对话的每端都需要一个Socket,两个Socket之间可以应用面向连接的或者是无连接的网络协议。

面向连接的协议通过互换确认信息在连接端口之间建立一条虚电路,它不必关心网络软件传送数据。

因而面向连接的客户程序不必指定本地协议端口,而只需为Socket提供远程主机信息;IP地址和协议端口,WinSock可自动保存本地IP地址和选择本地端口。

面向连接的WinSock客户机/服务器模型,服务器在没有请求到达时,它处于等待状态。

一旦请求到来,服务器立即产生一个子进程,然后回到等待状态,由子进程相应请求。

当下一个请求到达时,服务器再产生一个新进程。

其中,并发服务器成为主服务器,子进程称为从服务器。

这种主从服务器的方式巧妙地解决了并发请求问题。

四、主要数据结构CSFTPApp类CWinApp类的派生类,由编译器自动生成,该对象代表了应用进程的主线程。

CMainFrame类CFrameWnd类的派生类,由编译器自动生成,用于创建应用程序的主窗口,它能很好地支持系统菜单和控制条(工具条、状态条等)。

在编写文档/视图结构的应用程序时,它作为主窗口管理视图和文档对象。

CSFTPDoc类CDocument类的派生类,由编译器自动生成,它只是提供了一个框架,为文档对象与相关的其他对象(视图、应用程序对象及框架窗口等)进行交互提供了框架。

对CSFTPDoc 类的设计工作,基本上都是在这个已有框架的基础上,添加所需要的功能代码。

CDFTPView类CListView类的派生类,同样由编译器自动生成,在本程序中用于显示FTP服务器上的文件列表。

CAboutDlg类CDialog类的派生类,由编译器自动生成,用于显示帮助信息。

CMessageDlg类CDialog类的派生类,用于显示从FTP服务器发来的响应信息。

CListItem类用来解析FTP服务器发送过来的文件列表信息,将每个文件的类型、名称、大小、创建时间和访问权限分别提取出来。

CFTPClient类这是实现FTP协议的主要部分,也是本文档要着重解释的一个类。

五、CFTPClient类控制连接的实现FTP客户端与服务器端建立连接的流程为1.创建一个套接字,并且与服务器建立连接。

2.创建CArchive对象、CSocketFile对象和CSocket对象之间的关联。

3.用于控制的数据流连接已经建立,可以发送命令与接收响应。

4.依次发送USER和PASS命令成功登录服务器。

MFC中提供了一个网络编程模式,可以充分利用CSocket的特性。

该模式的基础是CSocketFile类。

使用方法如下:首先,构造一个CSocket对象;调用Create函数创建一个socket对象(SOCK_STREAM类型)。

接着,如果是客户程序,调用Connect连接到远地主机;如果是服务器程序,先调用Listen监听socket端口,收到连接请求后调用Accept接收请求。

然后,创建一个和CSocket对象关联的CSocketFile对象,创建一个和CSocketFile 对象关联的CArchive对象,指定CArchive对象是用于读或者写。

如果既要读又要写,则创建两个CArchive对象。

创建工作完成之后,使用CArchive对象在客户和服务器之间传送数据。

使用完毕,销毁CArchive对象、CSocketFile对象、CSocket对象。

BOOL ConnectServer(CString serverhost,int serverport);首先创建一个套接字与服务器建立连接。

(代码如下图)然后建立CArchive对象(m_pCtrlOutarch和m_pCtrlInarch)、CSocketFile对象(m_pCtrlsokfile)和CSocket对象(m_Ctrlsok)之间的关联,用于发送和接收数据。

(代码如下图)BOOL FTPcommand(CString command);BOOL WriteStr(CString outputstring);int ReadStr();后两个方法WriteStr和ReadStr利用已经在ConnectServer()中初始化的两个CArchive对象提供的方法向服务器发送和接受数据,而FTPcommand(CString command)则是调用这两个函数实现发送命令和接收响应的功能。

(代码如下图)值得一提的是m_fc表示响应代码的第一位。

在FTP协议中,对响应代码有着详细的规定,1yz表示预备状态,2yz表示完成状态,3yz表示中间状态,4yz表示暂时拒绝状态,5yz表示永久拒绝状态。

例如:150 File status okay; about to open data connection. (文件状态OK,将打开数据连接)200 Command okay. (命令OK)331 User name okay, need password. (用户名OK,需要密码)425 Can't open data connection. (不能打开数据连接)501 Syntax error in parameters or arguments. (参数语法错误)故m_fc可用于判断操作是否成功。

BOOL Logon(CString hostname,int hostport,CString username, CString password);登录FTP服务器的函数,(主要代码如下)。

数据连接的实现BOOL DownloadFile(CString remotefile, CString localfile,BOOL get);数据传输由本函数实现流程图如下:BOOL List();本函数用于接收由数据通道发来的文件列表信息,基本流程与DownloadFile函数相同,唯一的区别是DownloadFile把数据写入文件,而List()接收数据后进行解析并显示出来。

六、体会通过本工程的实践,不论是FTP原理和算法,还是编程能力上都有很大提高。

一方面,实践了许多计算机网络介绍的算法,使得学习印象很深,收获很大,另一方面,熟悉了VC++和MFC环境编程,使自己在能力上有很大的提高。

项目完成过程中得到了助教和同学的悉心帮助,在此表示感谢。

相关主题