VC中ftp協議實現多執行緒斷點續傳(轉)

ba發表於2007-08-15
VC中ftp協議實現多執行緒斷點續傳(轉)[@more@]ftp下載的好處我在這裡就不多說了,許多工程會把ftp下載作為一個重要的功能來實現。微軟提供的WinInet類可以利用下面這些函式:

  InternetOpen;

  InternetConnect;

  GetCurrentDirectory;

  SetCurrentDirectory;

  FtpGetFile;

很容易實現ftp的下載,網上關於這方面的文章也很多。但是要實現ftp的多執行緒下載,利用這些函式就顯得有些牽強了。用socket根據ftp協議來開發將會變的十分靈活。下面我就逐步的講解整個開發的過程:開發環境 BCB(元件模式),VC 環境下請自行稍作改動。看了這篇文章後對於BCB開發人員來說,不僅可以對 FlashGet 等軟體的開發原理有一定的瞭解,特別是在開發元件方面也有很大的指導作用,請耐心的將它看完。很簡單!!

主要用到的命令為:USER,PASS,TYPE,SIZE,REST,CWD,PWD,RETR,PASV,PORT,QUIT;

USER:引數是標記使用者的Telnet串。使用者標記是訪問伺服器必須的,此命令通常是控制連線後第一個發出的命令,有些主機還會要求口令和帳戶。伺服器可以在任何時間接收新的USER命令以改變訪問控制和(或)帳戶資訊。這可以重新開始登入過程,所以傳輸引數不變,在進行中的檔案傳輸在過去的訪問控制引數下完成。

PASS:引數是標記使用者口令的Telnet串。此命令緊跟USER命令,在某些站點它是完成訪問控制不可缺少的一步。因此口令是個重要的東西,因此不能顯示出來,伺服器方沒有辦法隱藏口令,所以這一任務得由使用者FTP程式完成。

TYPE:引數指定表示型別。有些型別需要第二個引數,第一個引數由單個Telnet字元定義,第二個引數是十進位制整數指定位元組大小,引數間以分隔。

預設表示型別是ASCII非列印字元,如果引數未改變,以後只改變了第一個引數,則使用預設值。

SIZE:引數從FTP伺服器上返回指定檔案的大小。

REST:引數域代表伺服器要重新開始的那一點,此命令並不傳送檔案,而是略過指定點後的資料,此命令後應該跟其它要求檔案傳輸的FTP命令。

CWD:此命令使使用者可以在不同的目錄或資料集下工作而不用改變它的登入或帳戶資訊。傳輸引數也不變。引數一般是目錄名或與系統相關的檔案集合。

PWD:改變當前的工作目錄。

RETR:開始傳送指定的檔案。(從REST引數指定的偏移量開始傳送)

PASV:此命令要求伺服器DTP在指定的資料埠偵聽,進入被動接收請求的狀態,引數是主機和埠地址。

PORT:引數是要使用的資料連線埠,通常情況下對此不需要命令響應。如果使用此命令時,要傳送32位的IP地址和16位的TCP埠號。上面的資訊以8位為一組,逗號間隔十進位制傳輸。

QUIT:退出登入。

各個引數的具體用法舉例如下:

USER sandy //使用者名稱為sandy登入

PASS sandy //密碼為sandy

TYPE I

SIZE sandy.txt //如果sandy.txt檔案存在,則返回該檔案的大小

REST 100 //重新指定檔案傳送的偏移

CWD infor/ //獲取當前的工作目錄

PWD temp/ //改變當前的工作目錄

RETR //開始傳送檔案

PASV //進入被動模式

PORT h1,h2,h3,h4,p1,p2 //進入主動模式,h1,h2,h3,h4為ip地址的4個部分。p1,p2是16進位制的埠號

下面介紹一下各個函式的使用順序和一些應注意的地方:

使用這些命令的前提條件是客戶端和伺服器端建立了連線。比如ftp伺服器地址: 192.168.1.81 ,埠:21。那麼利用Winsock的API函式建立socket連線,然後使用USER,PASS登陸FTP伺服器.需要下載檔案,要確保檔案必須在當前工作目錄下,可以使用命令CWD和PWD。檢視和更改當前的工作目錄。使用SIZE命令獲取檔案的大小。我們想要多執行緒下載那麼就要求伺服器支援該功能。一般我們都會在開頭先使用REST命令判斷該ftp站點是否支援多執行緒下載。PORT和PASV兩個命令是用來建立資料連線的。他們的主要區別是: PORT需要你指定一個ip地址和埠與伺服器建立連線。PASV命令伺服器會返回h1,h2,h3,h4,p1,p2樣式的資料供客戶端連線。等資料連線建立後,就可以了使用REST,RETR進行多執行緒和斷點續傳檔案下載了。

上面講解了一點ftp下載的基本知識,下面主要介紹的是斷點續傳的檔案儲存技巧。

若要講斷點續傳的檔案儲存方式至少可以說出10種,但是各種方法都有利有弊,下面主要介紹一種我在工作中常常使用的一種檔案儲存方式:比如要下載一個364544位元組的檔案,檔名為:namelock.avi。因為要斷點續傳,所以在下載的過程中必須得儲存檔案的大小,已經下載的檔案的大小和各個執行緒的任務。

有兩種方法:

一、可以產生兩個檔案:內容檔案和配置檔案。

二、只需一個檔案:把配置檔案的資料載入到內容檔案的末尾。

這兩個都不失為好方法。我使用的是前一種,因為我水平有限,(對於臨界資源的訪問總是不能做到互坼,老出問題。)。這裡的字尾名希望大家要把它放在心上,字尾名是個象徵性的東西。就拿我們公司來說,擁有自己的MPEG編碼、解碼技術,比如原來5m的一首mp3歌曲,透過編碼可以 轉換成500K左右的.fun檔案(funinhand的前三個字)。再利用我們自己的解碼播放器邊下載邊解碼邊播放,音質和mp3不相上下。真正實現了手機上的流媒體技術。受到國內外高科技大公司的信賴。(不好意思,這裡有點像做廣告了。)講這些的另外一個企圖是這樣的:

內容檔案所使用的字尾名是我女朋友的英文名(namelock)的前三個字母. nam 。配置檔案使用的是我自己的英文名(sandy)的前三個字母.san 。所以說寫程式也可以很浪漫,因為這,女朋友又給了我的月生活零用錢增加了幾元,哈哈(大家也可以效仿)。言歸正傳,這兩個檔案嚴格意義上來講是臨時檔案,當檔案下載完畢的時候,namelock.avi.nam內容檔案應該改名為:namelock.avi。namelock.avi.san配置檔案也應該及時的刪除。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-957943/,如需轉載,請註明出處,否則將追究法律責任。

相關文章