Ftp客戶端編程 選擇自 adow 的 Blog

 

關於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命令。網上有許多資料裏也是把windowsFtp客戶端的命令和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,表明數據傳輸完成。值得注意的是,我們最好不要一次發送多條命令,例如我們要回到上層目錄並且顯示這個目錄,我們得發送CDUPPASVLIST,我們不能一下子發送:CDUP/r/n, PASV/r/n, LIST/r/n 而是發送完CDUP之後等待其響應代碼,然後再發送後面一條。當PASV返回之後,我們打開另一個socket連接到相關端口上。然後發送LIST,返回125之後在開始接收數據,最後返回226表明完成。對於上傳和下載也是差不多的過程(下載之前要先取得文件的大小)。

 

參考資料:

.NET網絡高級編程:清華大學出版社,Andrew Krowczyk

RFC959

VisualBasic.NET網絡編程學習捷徑;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章