1. 程式人生 > >FTP客服端程式設計(ftp協議指令程式設計)

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表示使用者名稱

QStringuser_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表示密碼

QStringpwd_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地址和一個埠號)

進入被動模式程式碼如下:

QStringpasv="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指令遍歷伺服器檔案

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

然後通過dataSock接收遍歷結果資料。

5.往伺服器傳送RETR指令下載檔案

首先需要重新進入被動模式(即進行第三步操作),在此過程中可以把dataSock銷燬重新構建一個dataSock

然後往伺服器傳送RETR指令,m_fileName是檔名

QStringretrStr="RETR"+m_fileName+"\r\n";
tcpSock->write(retrStr.toLocal8Bit());
之後就可以從dataSock裡面讀取下載的檔案資料了。