關(guān)于Ftp協(xié)議;
Ftp命令;
Ftp返回值;
Ftp編程結(jié)構(gòu);
關(guān)于Ftp協(xié)議:
關(guān)于Ftp協(xié)議,我想都大概了解,所以不做說明了。以下是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命令,但是可能也有許多人和我曾經(jīng)犯一樣的錯誤,錯認了Ftp命令。我原來在win2000的控制臺下打上Ftp,然后進入了Ftp提示符下,接著我用上了許多符有“windows”特色的命令,如“dir”,“cd”,看到它按照自己的想法在運行,以為自己便掌握了Ftp命令了。我非常有信心的打開編程工具,寫一個socket,然后向ftp服務(wù)器連接了。當然,服務(wù)器返回了信息提示是連接成功了,我便開始發(fā)送剛才用過的一些命令,可返回的信息大多都是“500 'xx': command not understood”。 最后,我發(fā)送了help命令,返回的結(jié)果讓我驚異不已,里面的命令大多我都沒用過。原來這些才是真正的Ftp命令。Windows里面的只是Ftp的客戶端工具,里面的命令根本不是Ftp命令。網(wǎng)上有許多資料里也是把windows里Ftp客戶端的命令和Ftp命令混在一起。真正的Ftp命令應(yīng)參考RFC959文檔中的說明(其實一些Ftp工具如CuteFtp里也把命令顯示出來)。其中經(jīng)常被使用的命令包括如下:
ABOR:中止;
CWD 目錄名:改變現(xiàn)有目錄;
CDUP:返回到父級目錄;
REIN:重新初始化服務(wù)器狀態(tài);
QUIT:退出;
PORT:設(shè)置數(shù)據(jù)傳輸端口;
PASV:轉(zhuǎn)為被動方式
TYPE A/I:傳輸方式;
MODE S/B/C:傳輸方式?;
RETR 文件名:下載文件;
STOR 文件名:上傳文件;
APPEND 追加本地文件到服務(wù)器;
RNFR:修改原文件名(修改之前的文件名)
RNTO:修改后的文件名;
DELE 文件名:刪除文件;
RMD 目錄夾:刪除文件夾;
MKD 目錄:新建目錄;
PWD 當前工作目錄;
LIST:列出該目錄中的項目;
SYST:查看服務(wù)器操作系統(tǒng)信息;
STAT查看Ftp參數(shù)狀態(tài);
Ftp命令的返回值:
每一個Ftp發(fā)送之后,F(xiàn)tp服務(wù)器都會返回一個字符串,其中包括一個返回代碼和一串說明信息。這個返回碼主要是用于判斷命令是否被成功執(zhí)行了。除此之外,還有一個非常重要的命令的返回。當發(fā)送PASV之后,返回“227 Entering Passive Mode (127,0,0,1,4,18)”。這意味著在服務(wù)器上有一個端口被開放,他將為我們后面接著的數(shù)據(jù)傳輸作好準備,但是我們?nèi)绾沃涝摱丝谔柲?,就?127,0,0,1,4,18)中,前面四位指服務(wù)器的地址,關(guān)鍵是最后兩位,將最后第二位乘256再加上最后一位的值就是我們的端口號,也就是4*256+18。取得端口號之后我們就可以用socket連接到這里。這為我們后面的工作作好準備了,因為我們的取得列表,上傳,下載文件都要依靠它來實現(xiàn)。常用的返回如下:
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客戶端編程結(jié)構(gòu):
前面已提到了Ftp命令及其響應(yīng)信息。其實我們做Ftp客戶端工具只不過是用一個winsocket連接上Ftp服務(wù)器,然后象其發(fā)送命令。在這個過程中,我們依靠發(fā)送——響應(yīng)的機制。即發(fā)送Ftp命令——接收返回的響應(yīng)信息——分析該信息——執(zhí)行相關(guān)操作——發(fā)送下一條命令。在一般意義上,有一個socket用來連接Ftp服務(wù)器的相關(guān)端口(如默認的21),它負責Ftp命令的發(fā)送和接收返回的響應(yīng)信息。一些操作如“進入目錄”,“刪除文件”,依靠這個socket發(fā)送一條命令就可完成了。然而對于有數(shù)據(jù)傳輸?shù)牟僮?,主要是顯示遠端目錄列表,上傳、下載文件,我們不得不依靠另一個socket來完成。在進行這種操作之前,必須發(fā)送PASV命令,它返回了227開頭的信息,在括號中有以逗號隔開的六個數(shù)字,前四個指服務(wù)器的地址,關(guān)鍵是最后兩個,將倒數(shù)第二個乘256再加上最后一個數(shù)字,其結(jié)果就是Ftp服務(wù)器開放的用于下一條命令來進行數(shù)據(jù)傳輸?shù)亩丝?。如我們得?27 Entering Passive Mode (127,0,0,1,4,18),那么端口號是4*256+18=1042。我們用一個socket來連接這個端口,之后,我們可根據(jù)具體的操作(顯示目錄LIST,上傳文件STOR,下載RETR)來發(fā)送命令。返回的響應(yīng)代碼為125開頭,也就是連接打開了,可以開始傳輸數(shù)據(jù),這時就可用socket的發(fā)送或接收方法來傳輸數(shù)據(jù)。完成之后,服務(wù)器會返回代碼226 Transfer complete,表明數(shù)據(jù)傳輸完成。值得注意的是,我們最好不要一次發(fā)送多條命令,例如我們要回到上層目錄并且顯示這個目錄,我們得發(fā)送CDUP,PASV,LIST,我們不能一下子發(fā)送:CDUP\r\n, PASV\r\n, LIST\r\n。 而是發(fā)送完CDUP之后等待其響應(yīng)代碼,然后再發(fā)送后面一條。當PASV返回之后,我們打開另一個socket連接到相關(guān)端口上。然后發(fā)送LIST,返回125之后在開始接收數(shù)據(jù),最后返回226表明完成。對于上傳和下載也是差不多的過程(下載之前要先取得文件的大?。?
參考資料:
.NET網(wǎng)絡(luò)高級編程:清華大學出版社,Andrew Krowczyk;
RFC959;
VisualBasic.NET網(wǎng)絡(luò)編程學習捷徑;
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點擊舉報。