關於Ftp協議;
Ftp命令;
Ftp返回值;
Ftp編程結構;
<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
關於Ftp協議:
關於Ftp協議,我想都大概瞭解,所以不做說明了。以下是RPC959的介紹:
The objectives of FTP are 1) to promote sharing of files (computer
programs and/or data), 2) to encourage indirect or implicit (via
programs) use of remote computers, 3) to shield a user from
variations in file storage systems among hosts, and 4) to transfer
data reliably and efficiently. FTP, though usable directly by a user
at a terminal, is designed mainly for use by programs.
Ftp命令:
也許很多人都用過Ftp命令,但是可能也有許多人和我曾經犯一樣的錯誤,錯認了Ftp命令。我原來在win2000的控制檯下打上Ftp,然後進入了Ftp提示符下,接着我用上了許多符有“windows”特色的命令,如“dir”,“cd”,看到它按照自己的想法在運行,以爲自己便掌握了Ftp命令了。我非常有信心的打開編程工具,寫一個socket,然後向ftp服務器連接了。當然,服務器返回了信息提示是連接成功了,我便開始發送剛纔用過的一些命令,可返回的信息大多都是“500 'xx': command not understood”。 最後,我發送了help命令,返回的結果讓我驚異不已,裏面的命令大多我都沒用過。原來這些纔是真正的Ftp命令。Windows裏面的只是Ftp的客戶端工具,裏面的命令根本不是Ftp命令。網上有許多資料裏也是把windows裏Ftp客戶端的命令和Ftp命令混在一起。真正的Ftp命令應參考RFC959文檔中的說明(其實一些Ftp工具如CuteFtp裏也把命令顯示出來)。其中經常被使用的命令包括如下:
ABOR:中止;
CWD 目錄名:改變現有目錄;
CDUP:返回到父級目錄;
REIN:重新初始化服務器狀態;
QUIT:退出;
PORT:設置數據傳輸端口;
PASV:轉爲被動方式
TYPE A/I:傳輸方式;
MODE S/B/C:傳輸方式?;
RETR 文件名:下載文件;
STOR 文件名:上傳文件;
APPEND 追加本地文件到服務器;
RNFR:修改原文件名(修改之前的文件名)
RNTO:修改後的文件名;
DELE 文件名:刪除文件;
RMD 目錄夾:刪除文件夾;
MKD 目錄:新建目錄;
PWD 當前工作目錄;
LIST:列出該目錄中的項目;
SYST:查看服務器操作系統信息;
STAT查看Ftp參數狀態;
Ftp命令的返回值:
每一個Ftp發送之後,Ftp服務器都會返回一個字符串,其中包括一個返回代碼和一串說明信息。這個返回碼主要是用於判斷命令是否被成功執行了。除此之外,還有一個非常重要的命令的返回。當發送PASV之後,返回“227 Entering Passive Mode (127,0,0,1,4,18)”。這意味着在服務器上有一個端口被開放,他將爲我們後面接着的數據傳輸作好準備,但是我們如何知道該端口號呢,就在(127,0,0,1,4,18)中,前面四位指服務器的地址,關鍵是最後兩位,將最後第二位乘256再加上最後一位的值就是我們的端口號,也就是4*256+18。取得端口號之後我們就可以用socket連接到這裏。這爲我們後面的工作作好準備了,因爲我們的取得列表,上傳,下載文件都要依靠它來實現。常用的返回如下:
125 Data connection already open; Transfer starting.
226 Transfer complete.
227 Entering Passive Mode (127,0,0,1,4,18).
230 User xxxxx logged in.
331 Password required for xxxxx.
425 Can’t open data connection.
226 Closing data connection.
Ftp客戶端編程結構:
前面已提到了Ftp命令及其響應信息。其實我們做Ftp客戶端工具只不過是用一個winsocket連接上Ftp服務器,然後象其發送命令。在這個過程中,我們依靠發送——響應的機制。即發送Ftp命令——接收返回的響應信息——分析該信息——執行相關操作——發送下一條命令。在一般意義上,有一個socket用來連接Ftp服務器的相關端口(如默認的21),它負責Ftp命令的發送和接收返回的響應信息。一些操作如“進入目錄”,“刪除文件”,依靠這個socket發送一條命令就可完成了。然而對於有數據傳輸的操作,主要是顯示遠端目錄列表,上傳、下載文件,我們不得不依靠另一個socket來完成。在進行這種操作之前,必鬚髮送PASV命令,它返回了227開頭的信息,在括號中有以逗號隔開的六個數字,前四個指服務器的地址,關鍵是最後兩個,將倒數第二個乘256再加上最後一個數字,其結果就是Ftp服務器開放的用於下一條命令來進行數據傳輸的端口。如我們得到227 Entering Passive Mode (127,0,0,1,4,18),那麼端口號是4*256+18=1042。我們用一個socket來連接這個端口,之後,我們可根據具體的操作(顯示目錄LIST,上傳文件STOR,下載RETR)來發送命令。返回的響應代碼爲125開頭,也就是連接打開了,可以開始傳輸數據,這時就可用socket的發送或接收方法來傳輸數據。完成之後,服務器會返回代碼226 Transfer complete,表明數據傳輸完成。值得注意的是,我們最好不要一次發送多條命令,例如我們要回到上層目錄並且顯示這個目錄,我們得發送CDUP,PASV,LIST,我們不能一下子發送:CDUP/r/n, PASV/r/n, LIST/r/n。 而是發送完CDUP之後等待其響應代碼,然後再發送後面一條。當PASV返回之後,我們打開另一個socket連接到相關端口上。然後發送LIST,返回125之後在開始接收數據,最後返回226表明完成。對於上傳和下載也是差不多的過程(下載之前要先取得文件的大小)。
參考資料:
.NET網絡高級編程:清華大學出版社,Andrew Krowczyk;
RFC959;
VisualBasic.NET網絡編程學習捷徑;