C语言实现被动模式下,FTP客户端从FTP服务器下载文件
-
1、搭建FTP服务器
- 此处用到的FTP服务器是在Win10系统下搭建的,具体服务器搭建与配置过程可参照另一篇我写的文章《Win10搭建FTP服务器详细教程》,本文中用到的FTP命令里的传递参数举例皆与上面提到的FTP服务器配置匹配。
- 此处用到的FTP服务器是在Win10系统下搭建的,具体服务器搭建与配置过程可参照另一篇我写的文章《Win10搭建FTP服务器详细教程》,本文中用到的FTP命令里的传递参数举例皆与上面提到的FTP服务器配置匹配。
-
2、名词解释
-
1、FTP协议
- FTP(File Transfer Protocol,文件传输协议) 是 TCP/IP 协议组中的协议之一。FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端。其中FTP服务器用来存储文件,用户可以使用FTP客户端通过FTP协议访问位于FTP服务器上的资源。
-
2、被动模式(Passive)
- FTP服务器收到PASV命令后,随机打开一个高端端口P(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,通过三次握手建立通道,然后FTP服务器将通过这个端口进行数据的传送。
-
3、命令通道(Command Socket)
- 客户端打开一个本地端口N(N > 1024)用来连接FTP服务器的 21 端口,建立命令通道,它负责 FTP 命令的发送和接收服务器返回的响应信息。
-
4、数据通道(Data Socket)
- 对于有数据传输的操作,比如传输下载文件,我们需要建立另一个数据通道来完成。进入被动模式后,服务器会打开一个端口P(P > 1024),此时客户端会打开一个新的端口(N + 1)去连接服务器的端口P,此通道负责传输文件数据。
- 对于有数据传输的操作,比如传输下载文件,我们需要建立另一个数据通道来完成。进入被动模式后,服务器会打开一个端口P(P > 1024),此时客户端会打开一个新的端口(N + 1)去连接服务器的端口P,此通道负责传输文件数据。
-
-
3、主要用到的FTP命令和对应的FTP响应码
FTP 每个命令都有 3 到 4 个字母组成,命令后面跟参数,用空格分开。每个命令都以 "\r\n"结束。-
- USER:“USER xiaokeai\r\n” → 用户名为:xiaokeai
- PASS:“PASS 123456\r\n” → 密码为:123456
- TYPE:“TYPE I\r\n” → 设置传输方式为二进制模式:I
- SIZE:“SIZE /AC1/APP.bin\r\n” → 获取APP.bin这文件的大小,文件路径:/AC1/APP.bin
- PASV:"PASV\r\n " → 让服务器进入被动模式
- RETR:“RETR /AC1/APP.bin \r\n” → 下载命令,文件路径:/AC1/APP.bin
- QUIT:“QUIT\r\n” → 退出FTP服务器命令
-
2、FTP响应码
-
- 220:“220 Microsoft FTP Service” → 命令通道已连接,服务器发送欢迎信息
- 331:”331 Password required” → 用户名正确,请求密码
- 230:”230 User logged in.” → 用户已登录
- 200:”200 Tpye set to I.” → 文件传输模式已改为二进制模式
- 213:”213 7968” → APP.bin文件大小为:7968个字节
- 227:”227 Entering Passive Mode (192,168,1,110,19,190).” → 服务器IP:192.168.1.110
服务器数据端口号:19 * 256 + 190 = 5054 - 125:”125 Data connection already open; Transfer starting.” → 数据连接已建立,开始传输数据
- 226:”226 Transfer complete.” → 数据传输完毕,提示客户端断开数据连接
- 221:”221 Transfer complete.” → 提示客户端断开命令连接
-
-
4、Socket 编程的几个重要步骤
- socket( ); → 服务器/客户端打开一个端口
- connect( ); → 创建一个命令/数据通道连接
- listen( ); → 监听
- close( ); → 断开命令/数据通道连接
-
5、实现被动模式下,FTP客户端从FTP服务器下载文件
-
1、客户端和服务器建立命令通道连接
- 客户端端口N和服务器端口21建立命令通道连接后,服务器返回“220…”欢迎信息
- 客户端端口N和服务器端口21建立命令通道连接后,服务器返回“220…”欢迎信息
-
2、客户端登陆FTP服务器
- 客户端发送用户名和密码,服务器验证通过后,会返回230的响应码。然后客户端就可以向服务器端发送命令了。
- 客户端发送用户名和密码,服务器验证通过后,会返回230的响应码。然后客户端就可以向服务器端发送命令了。
-
3、客户端设置文件传输方式,获取文件信息
- 客户端发送TYPE命令设置文件传输方式为二进制,再发送SIZE命令获取待下载文件的大小(单位字节)
- 客户端发送TYPE命令设置文件传输方式为二进制,再发送SIZE命令获取待下载文件的大小(单位字节)
-
4、客户端让FTP服务器进入被动模式,建立数据通道连接
- 客户端在下载文件前,要先发送PASV命令让服务器进入被动模式。进入被动模式后,服务器会打开数据端口P > 1024并监听,并返回响应码 227,227响应信息里包含服务器IP和端口号P的信息,客户端打开端口N + 1,与服务器端口P建立数据通道连接。
- 客户端在下载文件前,要先发送PASV命令让服务器进入被动模式。进入被动模式后,服务器会打开数据端口P > 1024并监听,并返回响应码 227,227响应信息里包含服务器IP和端口号P的信息,客户端打开端口N + 1,与服务器端口P建立数据通道连接。
-
5、客户端通过被动模式下载文件
- 建立数据通道连接后,客户端向服务器发送RETR命令下载文件,服务器会返回125响应码,并开始通过数据通道向客户端发送文件内容。
- 建立数据通道连接后,客户端向服务器发送RETR命令下载文件,服务器会返回125响应码,并开始通过数据通道向客户端发送文件内容。
-
6、下载完成,客户端退出服务器
- 当客户端下载完成后,服务器会发226响应码,客户端断开数据通道连接,然后服务器会发221响应码,客户端再断开命令通道连接。
- 当客户端下载完成后,服务器会发226响应码,客户端断开数据通道连接,然后服务器会发221响应码,客户端再断开命令通道连接。
-
-
6、部分代码展示