實現FTP多線程下載

來源:互聯網
上載者:User
現在有不少軟體可實現多線程下載.如NetAnts,JetCar等,其實多線程下載的原理並不複雜,主要的兩項技術就是多線程和斷點下載。程式中開啟多個線程,每個線程利用斷點下載,分別下載檔案的不同部分,下載完後合并,就可以了。多線程編程很多書已有介紹,這裡不再重複,關於斷點下載,MFC中提供的CInternetFile類可實現HTTP的斷點下載,但無法實現FTP的斷點下載。因此,我們只好從FTP協議中的命令入手,自己編寫個FTP類,來實現多線程下載。本人編寫的CMultiFTP類(在WIN2000+IIS5。0下測試成功)已在CSDN發表。

FTP指令的詳細資料,大家可從http://info.internet.isi.edu/in-notes/rfc/     處獲得,這裡給大家介紹下與多線程下載有關的幾個指令極其格式:

USER〈USERNAME〉:登陸FTP的使用者名稱,執行成功返回220;

PASS〈PASSWORD〉:密碼,執行成功返回230;

REST〈POS〉:指定檔案下載的開始位置,執行成功返回350;

SIZE〈FILENAME〉:檔案大小,執行成功返回213;

PASV:建立資料連線,同時取得FTP伺服器下載檔案時用的連接埠號碼,執行成功返回227;

TYPE:指定下載檔案的類型,參數為I是二進位檔案,為A是字元檔案,執行成功返回200;

RETR〈FILENAME〉:下載檔案,執行成功返回125;

這些命令中,REST,RETR,SIZE三個命令最關鍵,在後面會給大家更詳細的說明,另外執行FTP命令,FTP伺服器會向用戶端返回一代碼,命令執行成功的代碼上面已給出。向伺服器發送命令,可把命令當作字串向伺服器發送,如:send(socket,”rest 100 ”,…)(注意:要在命令後加 )。

在介紹多線程下載前,先給大家介紹下串連FTP伺服器和從FTP伺服器下載檔案的過程。串連FTP SERVER很簡單,建立一通訊端,指定伺服器的地址和連接埠號碼,串連到伺服器,再向它發送USER和PASS命令,伺服器返回230,就代表登陸成功,並且伺服器和客戶建立了一控制串連。

FTP伺服器下載檔案的過程比較複雜。首先,用戶端要和伺服器建立一資料連線,可用PORT或PASV命令建立資料連線,PORT命令要自己指定一連接埠號碼用於下載,PASV命令則由伺服器分配一連接埠號碼,用戶端可從伺服器的返回資訊提取連接埠號碼,返回資訊的格式為:

(伺服器IP,連接埠號碼),本人的程式將使用PASV命令。然後向伺服器發送RETR命令下載檔案,或先發送一REST命令指明從哪下載檔案。之後,要建立一新的通訊端,串連到資料連線指定的連接埠,檔案資料就從這個通訊端下載。下載完畢後,關閉通訊端。

現在進入本篇的精華,實現多線程下載。執行完登陸操作後,先發送“REST 100”命令,測試下伺服器是否支援斷點下載,如返回成功碼,就可實現多線程下載;然後發送“SIZE”,取得檔案的大小,根據檔案大小,將檔案分為幾部分,記下各部分的位移地址,並作為參數,交給各線程去下載。在下載線程中,先接受主線程傳給他的參數(檔案名稱,位移地址,儲存地址等),再發送“PASV”命令,建立資料連線,並建立一通訊端串連到新的連接埠;然後根據檔案類型,二進位檔案發送“TYPE  I“命令,文字檔發送”TYPE  A“命令;之後發送“REST  〈檔案位移地址〉”命令,通知伺服器改變將要下載的檔案的開始地址;最後,執行“RETR 〈檔案名稱〉”命令,下載檔案。下載完畢後,編段代碼合并檔案即可。

在這裡有個問題,就是主線程如何得知各下載線程已執行完畢。WINDOWS提供了幾種線程互斥技術,如CriticalSection,Mutex等,關於他們的詳細資料,大家可參考各種編程書籍,在這裡我推薦使用CriticalSection技術。可以在程式中建立一全域計數器,在檔案下載前置零,並建立一全域CriticalSection變數。在下載線程中,當檔案下載完畢後,先鎖定全域CriticalSection變數,之後將計數器加一,再釋放全域CriticalSection變數。主線程中,可建立一定時,定期檢查計數器的值,或讓下載線程在下載完畢後調用主線程的某個函數。這樣,主線程就可隨時發現檔案已下載完畢,可合并檔案了。

多線程下載的程式設計就是這樣,一點都不難。看來掌握某些電腦技術,特別是網路技術,最好還是從實現原理入手,掌握其最精華的部分,激發自己的靈感,編寫出個優秀軟體。老停留在使用別人的組件和函數庫的基礎上,你的水平不會有太大提高。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.