全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3980
推到 Plurk!
推到 Facebook!

如何實現FTP多線程下載

 
jackkcg
站務副站長


發表:891
回覆:1050
積分:848
註冊:2002-03-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2002-10-26 13:24:04 IP:61.221.xxx.xxx 未訂閱
此為轉貼資料 如何實現FTP多線程下載 現在有不少軟體可實現多線程下載.如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\r\n”,…)(注意:要在命令後加\r\n)。 在介紹多線程下載前,先給大家介紹下連接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變數。主線程中,可建立一定時,定期檢查計數器的值,或讓下載線程在下載完畢後調用主線程的某個函數。這樣,主線程就可隨時發現文件已下載完畢,可合併文件了。 多線程下載的程式設計就是這樣,一點都不難。看來掌握某些電腦技術,特別是網路技術,最好還是從實現原理入手,掌握其最精華的部分,激發自己的靈感,編寫出個優秀軟體。老停留在使用別人的元件和函數庫的基礎上,你的水平不會有太大提高。
------
**********************************************************
哈哈&兵燹
最會的2大絕招 這個不會與那個也不會 哈哈哈 粉好

Delphi K.Top的K.Top分兩個字解釋Top代表尖端的意思,希望本討論區能提供Delphi的尖端新知
K.表Knowlege 知識,就是本站的標語:Open our mind
系統時間:2024-04-25 16:24:20
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!