FTP客服端编程(ftp协议指令编程)

先上图


第一步应该做的就是搭建服务器,或者下载简易ftp服务器。如果不知道怎么在主机上搭建ftp服务器上篇文章中有详细解说。

ftp客户端的实现大致是这么几个流程:

ftp客户端需要两个tcpSocket,一个tcpSock负责给服务器发送指令、接受服务器的响应信息,另一个dataSock用来接收下载数据,或是接收服务器文件名列表数据

1.客户端使用tcpSock连接服务器。

ftp服务器IP为主机IP,指令端口号为21,通过ip和端口号可连接上ftp服务器

连接成功后ftp服务器会给客户端发送响应信息(这些信息存储在tcpSock中),补充说明tcpSock通过IP连接ftp服务器,在自己主机上搭建的ftp服务器IP地址都是主机地址

连接成功后具体的响应信息如下:

响应信息:"220 Microsoft FTP Service"

2.客户端通过账户、密码登陆ftp服务器

客户端通过tcpSock给服务器发送用户名指令:m_user表示用户名

QString user_cmd = QObject::tr("USER ")+m_user + "\r\n";
    tcpSock->write(user_cmd.toLatin1());
tcpSock收到的响应信息如下:

响应信息:"331 Anonymous access allowed, send identity (e-mail name) as password."

然后客户端给服务器发送用户名指令:m_pwd表示密码

QString pwd_cmd = QObject::tr("PASS ")+m_pwd + "\r\n";
    tcpSock->write(pwd_cmd.toLatin1());

如果成功登陆tcpSock收到的响应信息为:

响应信息:"230 User logged in."

如果是在自己主机上搭建的ftp服务器,用户是匿名的话,那么用户名为anonymous,密码为空。

3.登陆成功后需要进入被动连接模式(PORT是主动连接模式,当客户端选择这种模式与服务器进行连接的时候,它需要向服务器提供一个IP地址和一个端口号,而PASV是被动模式,当选择这种模式时,服务器需要提供给客户端一个IP地址和一个端口号)

进入被动模式代码如下:

QString pasv = "PASV \r\n";
    tcpSock->write(pasv.toLatin1());
tcpSock可收到响应信息:

响应信息:"227 Entering Passive Mode (192,168,2,159,18,94)."

前4个数为ftp的IP地址,根据后两个数计算下载或上传的数据通信的端口号,端口号计算方式:18*256+94

根据IP和端口号使用dataSock连接ftp服务器

4.往服务器发送LIST指令遍历服务器文件

QString find_list="LIST \r\n";
        tcpSock->write(find_list.toLatin1());

然后通过dataSock接收遍历结果数据。

5.往服务器发送RETR指令下载文件

首先需要重新进入被动模式(即进行第三步操作),在此过程中可以把dataSock销毁重新构建一个dataSock

然后往服务器发送RETR指令,m_fileName是文件名

QString retrStr = "RETR "+m_fileName+"\r\n";
        tcpSock->write(retrStr.toLocal8Bit());
之后就可以从dataSock里面读取下载的文件数据了。