先上图
第一步应该做的就是搭建服务器,或者下载简易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."
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里面读取下载的文件数据了。