C 實現FTP斷點續傳

2021-06-09 04:38:35 字數 2701 閱讀 5514

一、前言

在internet網際網路應用程式支援上,microsoft提供了win32 internet api函式支援,此型別的api是由wininet.dll動態鏈結函式庫所提供的。

win32 internet api(即 wininet)幫助實現對 gopher、ftp 和 http 等常用 internet協議的訪問。使用 wininet 可以在較高程式設計級別上編寫 internet 客戶端應用程式,且無須處理winsock、tcp/ip 和特定 internet 協議的細節問題。wininet 為所有這三種協議提供了一組一致的函式,並採用常用的 win32 api 介面。該一致性使當基礎協議改變(例如從 ftp 改為 http)時所需做的**改動減到最小。

採用win32 internet api實現ftp客戶端有以下優點:

n         從 ftp伺服器讀取資訊像從硬碟讀取檔案一樣容易。

n         使用 win32 internet 函式的開發人員不需要熟悉 tcp/ip 或 windows sockets,對於許多常見的操作,開發人員不需要知道他們所使用的具體協議的細節。但開發人員仍可直接使用 winsock 和 tcp/ip 協議在套接字級別程式設計,

在以前的準省級系統中的ftp檔案傳輸及ic卡管理系統ftpstation就是採用這種方法實現的。但是在使用的過程中發現以下問題:

n         網路狀況不穩定時,檔案沒有完全上傳,但系統仍然報告檔案上傳成功。

n         網路狀況不穩定時,檔案傳輸過程中斷,任務排程系統的檔案傳輸任務被阻塞掛起,造成以後的檔案無法上傳,只能重新啟動任務排程系統才行。

n         win32 internet api中未提供支援斷點續傳的函式,如果需要實現此功能,必須在winsock級別進行程式設計,程式設計師需要了解很多的ftp協議及程式設計細節。自己編寫續傳方法,可靠性難以保證。

2.2 ftp元件

ftp協議是乙個標準的、成熟的協議,目前很多開發工具中都包含了ftp元件,它們在更高的層次上進行封裝,提供豐富的方法和屬性,使得程式設計師可以在無需了解ftp細節的情況下輕鬆開發出強大的ftp客戶端和ftp伺服器軟體。在c++ builder 6中包含了兩種元件可以用來開發ftp應用程式:tnmftp和indy。此外,還有許多成熟的第三方元件,如ics(internet component suite)等。

1)      tnmftp控制項

tnmftp控制項支援ftp協議,使用該元件要求機器上有32位的tcp/ip協議棧 wsock32.dll。在windows95及以後的作業系統都有該dll。tnmftp控制項使用非同步工作模式,採用事件觸發機制,並提供了豐富的屬性和方法,支援**和斷點續傳,可以用它來開發乙個強大的ftp客戶端程式。以前的資料採集器系統(準省級前身)就是採用該元件實現檔案傳輸的。但是,在使用的過程中,該元件也存在不足:

n         它採用的是非同步工作模式,這在開發互動式ftp客戶端程式時特別有用,但在準省級任務排程系統中,ftp任務實現為乙個dll,不提供使用者介面,由主程式排程執行,無需使用者干預。如果採用非同步工作模式,需要複雜的控制來保證各步驟的順序執行。

n         在使用過程中發現該元件存在記憶體洩漏的問題,網上也有許多人指出該元件存在bug,borland公司不再對該元件進行支援。這個問題對於需要長期穩定執行的系統來說是非常嚴重的。

n         在使用該元件時,發現傳送大檔案時不穩定,當檔案大小超過100m時,經常會出現傳輸中斷的情況。

2)      indy元件

n         該元件未提供支援斷點續傳的方法,並且當取消檔案傳輸時,以前傳輸的內容並未真正傳送到ftp伺服器上。

n         不支援**伺服器,未提供設定**伺服器的屬性或方法。

3)      ics(internet component suite)

三、方案設計

讓ftp檔案傳輸具備斷點續傳功能,除了客戶端需要採用一定的程式設計技巧外,ftp伺服器也必須支援斷點續傳。在本方案中,主要討論客戶端的實現方法,如果伺服器不支援斷點續傳,則應該遮蔽該功能。

3.1資料結構和關鍵類

圖1 檔案傳輸資訊類圖

其中:u       id:唯一標識,無實際意義。

u       host:ftp伺服器名或ip位址。

u       remotedir:ftp伺服器的工作路徑。

u       remotefilename:ftp伺服器上的檔名。

u       localfilename:本地上的檔名,包含路徑。

u       filesize:上次檔案傳輸的位元組數。

u       flag:正常退出標誌,0-中斷,1-非正常中斷。斷點續傳中關鍵是需要知道上次檔案傳輸了位元組,但是如果程式異常退出時,可能未能正確記錄上次傳輸的位元組數,這時需要從頭開始傳輸。

檔案傳輸記錄儲存在檔案中。因此該類還提供了以下方法:

u       serialize:序列化方法,將檔案傳輸資訊序列化到檔案流中。

u       gettransferinfos:從檔案中載入檔案傳輸記錄到鍊錶中,鍊錶中的每一項為一條傳輸記錄。

準省級任務排程系統每天會啟動檔案傳輸任務,如果每次檔案傳輸都記錄下來,這個檔案就會越來越大。因此,如果檔案傳輸完畢,記錄就從鍊錶中移除,檔案中只記錄需要續傳的檔案。

3.2流程圖

圖2 檔案傳輸流程圖

注:在檔案傳輸過程中可能會由於網路原因或人為終止,這時傳輸過程會終止。在檔案傳輸的過程中會觸發tftpclient元件的onprogress事件,該事件具有引數,表明目前已傳送的位元組數

FTP實現斷點續傳

ftp客戶端實現要建立兩個通道,乙個控制命令通道,讓ftp伺服器知道客戶端要幹什麼,乙個資料傳輸通道。所謂的兩個通道只不過是兩個呼叫了connect函式的連線,只是控制命令通道專門用來傳輸一些字串命令資訊,而資料通道則是用來傳輸檔案。控制命令通道一定是由客戶端向伺服器的連線 預設的埠是21,也可以指...

FTP實現斷點續傳

ftp客戶端實現要建立兩個通道 乙個控制命令通道,讓ftp伺服器知道客戶端要幹什麼,乙個是資料傳輸通道。所謂的兩個通道只不過是兩個呼叫了connect函式的連線,只是控制命令通道專門用來傳輸一些字串命令資訊,而資料通道則是用來傳輸檔案。控制命令通道一定是由客戶端向伺服器的連線 預設的埠是21,也可以...

ftp斷點續傳

import open.mis.data.downloadstatus import open.mis.data.uploadstatus import org.apache.commons.net.printcommandlistener import org.apache.commons.net...