使用 Socket 通信实现 FTP 客户端程序
文件传输协议〔FTP〕作为网络共享文件的传输协议,在网络应用软件中具有广泛的应用。FTP 的目标是提高文件的共享性和可靠高效地传送数据。
在传输文件时,FTP 客户端程序先与服务器建立连接,然后向服务器发送命令。服务器收到命令后给予响应,并执行命令。FTP 协议与操作系统无关,任何操作系统上
的程序只要符合 FTP 协议,就能够相互传输数据。本文要紧基于 LINUX 平台,对 FTP 客户端的实现原理进行详尽的说明并阐述如何使用 C 语言编写一个简单的 FTP
客户端。
回页首
FTP 协议
相比其他协议,如 协议,FTP 协议要复杂一些。与一样的 C/S 应用不同点在于一样的 C/S 应用程序一样只会建立一个 Socket 连接,那个连接同时处理服务器
端和客户端的连接命令和数据传输。而 FTP 协议中将命令与数据分开传送的方法提高了效率。
FTP 使用 2 个端口,一个数据端口和一个命令端口〔也叫做操纵端口〕。这两个端口一样是 21 〔命令端口〕和 20 〔数据端口〕。操纵 Socket 用来传送命令,数据
Socket 是用于传送数据。每一个 FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息。其中的返回码要紧是用于判定命令是
否被成功执行了。
命令端口
一样来说,客户端有一个 Socket 用来连接 FTP 服务器的相关端口,它负责 FTP 命令的发送和接收返回的响应信息。一些操作如〝登录〞、〝改变名目〞、〝删除文
件〞,依靠那个连接发送命令就可完成。
数据端口
关于有数据传输的操作,要紧是显示名目列表,上传、下载文件,我们需要依靠另一个 Socket 来完成。
假如使用被动模式,通常服务器端会返回一个端口号。客户端需要用另开一个 Socket 来连接那个端口,然后我们可依照操作来发送命令,数据会通过新开的一个端口传
输。
假如使用主动模式,通常客户端会发送一个端口号给服务器端,并在那个端口监听。服务器需要连接到客户端开启的那个数据端口,并进行数据的传输。
下面对 FTP 的主动模式和被动模式做一个简单的介绍。
主动模式 (PORT)
主动模式下,客户端随机打开一个大于 1024 的端口向服务器的命令端口 P,即 21 端口,发起连接,同时开放 N +1 端口监听,并向服务器发出 〝port N+1〞 命令,
由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)。
FTP 的客户端只是告诉服务器自己的端口号,让服务器来连接客户端指定的端口。关于客户端的防火墙来说,这是从外部到内部的连接,可能会被堵塞。
被动模式 (PASV)
为了解决服务器发起到客户的连接问题,有了另一种 FTP 连接方式,即被动方式。命令连接和数据连接都由客户端发起,如此就解决了从服务器到客户端的数据端口的
连接被防火墙过滤的问题。
被动模式下,当开启一个 FTP 连接时,客户端打开两个任意的本地端口 (N > 1024 和 N+1) 。
第一个端口连接服务器的 21 端口,提交 PASV 命令。然后,服务器会开启一个任意的端口 (P > 1024 ),返回如〝227 entering passive mode (127,0,0,1,4,18)〞。
它返回了 227 开头的信息,在括号中有以逗号隔开的六个数字,前四个指服务器的地址,最后两个,将倒数第二个乘 256 再加上最后一个数字,这确实是 FTP 服务器
开放的用来进行数据传输的端口。如得到 227 entering passive mode (h1,h2,h3,h4,p1,p2),那么端口号是 p1*256+p2,ip 地址为 h1.h2.h3.h4。这意味着在服务器上有
一个端口被开放。客户端收到命令取得端口号之后, 会通过 N+1 号端口连接服务器的端口 P,然后在两个端口之间进行数据传输。
要紧用到的 FTP 命令
FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以 ""终止。
要下载或上传一个文件,第一要登入 FTP 服务器,然后发送命令,最后退出。那个过程中,要紧用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、
PORT、QUIT。
USER: 指定用户名。通常是操纵连接后第一个发出的命令。〝USER gaoleyi〞: 用户名为 gaoleyi 登录。
PASS: 指定用户密码。该命令紧跟 USER 命令后。〝PASS gaoleyi〞:密码为 gaoleyi。
SIZE: 从服务器上返回指定文件的大小。〝SIZE file.txt〞:假如 file.txt 文件存在,那么返回该文件的大小。
CWD: 改变工作名目。如:〝CWD dirname〞。
PASV: 让服务器在数据端口监听,进入被动模式。如:〝PASV〞。
PORT: 告诉 FTP 服务器客户端监听的端口号,让 FTP 服务器采纳主动模式连接客户端。如:〝PORT h1,h2,h3,h4,p1,p2〞。
RETR: 下载文件。〝RETR file.txt 〞:下载文件 file.txt。
STOR: 上传文件。〝STOR file.txt〞:上传文件 file.txt。
REST: 该命令并不传送文件,而是略过指定点后的数据。此命令后应该跟其它要求文件传输的 FTP 命令。〝REST 100〞:重新指定文件传送的偏移量为 100 字节。
QUIT: 关闭与服务器的连接。
FTP 响应码
客户端发送 FTP 命令后,服务器返回响应码。
响应码用三位数字编码表示:
第一个数字给出了命令状态的一样性指示,比如响应成功、失败或不完整。
第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证。
第三个数字提供了更加详细的信息。
第一个数字的含义如下:
1 表示服务器正确接收信息,还未处理。
2 表示服务器差不多正确处理信息。
3 表示服务器正确接收信息,正在处理。
4 表示信息临时错误。
5 表示信息永久错误。
第二个数字的含义如下:
0 表示语法。
1 表示系统状态和信息。
2 表示连接状态。
3 表示与用户认证有关的信息。
4 表示未定义。
评论0
最新资源