邢彬 /* XingBin.net */
XING Bin, a Coder, Geek, Railfan, and Outdoors Fan
face

使用Winsock实现FTP客户端

发布 / 2006-04-18 12:39   于 / 邢彬作品   文 / XingBin   浏览 / 5261  

实验目标和内容
1. 实验目的
 了解应用层和运输层的作用及相关协议的工作原理和机制。
 掌握SOCKET 编程的基本方法。
2. 实验环境
 Windows 操作系统
 C 或者C++编程开发环境
3. 实验要求
 必须采用基于Win32 的WinSock 编程,不能直接借用任何现成的MFC 类和组件(可用MFC 实现图形用户界面,WinSock 编程不能利用MFC 类)。
 提交实验设计报告和源代码;实验设计报告必须包括程序流程,源代码必须加详细注释。
 基于自己的实验设计报告,通过实验课的上机试验,在VC6.0 环境下将源代码编译成功,运行演示给实验指导教师检查。
4. 实验内容
编写一个FTP 客户端,要求如下:
 能够指定FTP 服务器的IP 地址和端口号。
 能够按照主动(PORT)和被动(PASV)两种模式连接FTP 服务器。
 支持匿名和用户名/口令二种身份验证。
 实现单线程下载/上传单个文件。
 能够主动断开连接。
 可采用控制台或图形用户界面2 种方式。

二、功能简介
    这个FTP客户端程序使用的了VC++6.0开发环境,MFC构架程序外观,Winsock 2.0建立连接。实现了简单的服务器连接、文件上传与下载的功能。程序基于MFC对话框。由于对MFC不是很熟悉,因此所有的函数在这个对话框类中,一些用于传递数据的变量被置为全局变量。
    程序首先从用户界面获取要连接的服务器地址或者端口号,初始化Winsock,建立socket并和这个端口进行连接,用于发送和接收命令。(以下称这个为命令socket)连接建立完毕后,向服务器发送USER、PASS命令登陆服务器,如果登陆成功,则获取服务器文件列表,否则断开连接。
    获取文件服务器列表、上传与下载都需要通过另外一条数据通道进行数据的传输。
    在被动方式下,客户端通过命令socket发送PASV命令,则服务器返回一个服务器的IP地址和端口号。之后客户端建立一个数据socket,绑定本地地址和端口,并连接刚才获取的服务器的IP地址和端口号。如果连接成功,那么通过原来的命令socket传递命令,比如TYPE确定数据传输类型,STOR上传文件,RETR下载文件等等。命令传输并得到服务器的响应后,即可通过数据socket进行数据的发送与接收。传输完毕后关闭这个数据socket。
    在主动方式下,客户端首先建立一个socket,并获取本地地址和一个空闲的端口号与之绑定,然后通过命令socket向服务器发送该地址和端口号。服务器收到后会返回一个确认消息。然后开启listen,再向服务器发送一个命令,这是服务器会来连接客户机,此时的模式好比客户机变成了服务器,服务器变成了客户机。客户机accept,这条数据socket建立完成,只需要通过它传输数据即可。
右面的服务器端文件列表使用的是CListCtrl控件,对其的单击事件进行相应,如果是目录,那么将服务器路径改变,通过CWD命令切换到新的路径并重新获取文件列表。此处对于父目录没有使用CDUP命令,而是设置了一个CString的外部变量,专门用来存储当前服务器的路径,统一通过CWD进行目录切换。
    如果右面选中的是文件而不是目录,那么激活删除与下载按钮。如果是删除,则弹出提示框,如果用户确认,通过DELE命令删除文件。如果是下载,则像刚才介绍的连接数据socket的过程一样,进行文件的下载。
    如果需要断开连接,那么将执行以下事件:向服务器发送QUIT命令并接受服务器的返回消息,清除服务器文件列表,清除Winsock环境。

LOGIN
FOLLOW ME
COPYRIGHT
Creative Commons License
除特殊声明的页面外,本站作品采用 知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议 进行许可。