DSP應用例項(一)--輕鬆實現BT多點下載 (轉)
DSP應用例項(一)--輕鬆實現BT多點
----簡稱"BT"下載,是現在最流行的下載方式,它的主要特點就是多IP下載,一個可以從多個IP被同時下載,使下載速度達到極限。
在這個資料包裡提供了一個標準的DSPSpr類,使用該類可以輕鬆實現BitTorrent多點下載。在採用BitTorrent和下載時,需要預先對進行掃描生成整個檔案的後,才會正式開始下載檔案,當檔案很大時,檔案的建立時間會較長,使像當機了一樣,實際是在建立檔案。DSPSpider採用了更先進的方式,在下載檔案前無需對磁碟進行掃描,檔案採用動態建立,隨著下載的完成度而逐步增加,並且下載過程中不需要額外建立任何附加的檔案。這次釋出的為de版,正式版中將包含有更多、更完善的功能。
只需在窗體中響應以下7個訊息,就可以輕鬆實現BT多點下載。
1 MSG_REECT 接收方訊息
接收到了一部分資料,每接收到一部分資料時,就會向指定窗體傳送該訊息。
必需DSPSpider.OnUpdateSect(wParam,lParam),該將返回當前已經下載的位元組個數。
wParam -- 指向DSPSpider::_FILEDETAIL結構的指標
lParam -- 當前接收到的位元組數
2 MSG_SENDCOMPLETE 接收方訊息
接收過程中止,原因可能是檔案已全部下載或下載被中止。
必需呼叫DSPSpider.OnSendComplete(wParam,lParam),該函式將返回一個數字,如果返回1,則表示檔案已經全部下載完成;如果返回2,則表示檔案還沒有下載完,但是所有執行緒已經終止,原因可能是傳送方終止或接收方終止或下載過程中出現了錯誤。關於執行緒中止的具體原因,可以透過呼叫DSPSpider::GetCompleteInfo(lParam,str)函式得到錯誤的具體原因。
wParam -- 指向DSPSpider::_FILEDETAIL結構的指標
lParam -- 錯誤的原因
3 MSG_SETFILENAMESIZE 接收方訊息
傳送當前接收的檔案的大小,檔名,可以在這裡設定顯示,該訊息只在開始時傳送一次
wParam -- 指向DSPSpider::_FILEDETAIL結構的指標
DSPSpider.GetProgressStep()得到步長
DSPSpider.GetCurrSize()得到檔案的當前的長度
4 MSG_SHOWPROMPT 接收方訊息
顯示提示資訊,在檔案的接收過程中,會不斷地傳送該訊息,傳遞當前接收過程的狀態
wParam -- 低16位,訊息的ID。高16位的低8位,當前的下載執行緒個數;高16位的高8位,當前的下載執行緒中休眠執行緒的個數。
lParam -- 如果不為0,則表示連線方的的字串表示
5 MSG_ASSIGNNEWSECT 接收方訊息 這是一個必需響應的訊息
在該訊息中直接呼叫DSPSpider.OnAssignNewSect(wParam,lParam)函式。
6 MSG_CREATERECVTHREAD 接收方訊息 這是一個必需響應的訊息
在該訊息中直接呼叫DSPSpider.OnCreateRecvThread(wParam,lParam)函式。
7 MSG_GETFILENAME 傳送方訊息 這是一個必需響應的訊息
當接收到一個傳送請求時,根據接收方傳遞的檔名,決定需要傳送的檔名。
wParam -- 指向DSPSpider::_FILEDETAIL結構的指標
在響應該訊息時,呼叫DSPSpider::SetFilename(wParam,strPathname),該函式將設定傳送檔案的名字,包含路徑名。
DSPSpider中的結構說明
_SENDTHREADPARAM結構,建立執行緒時所需要傳遞的結構。
pCWnd -- 接收訊息的窗體,如果是傳遞給監聽執行緒的引數,則該窗體必需響應MSG_GETFILENAME訊息。
bInte -- 是否是Internet應用,true表示Internet應用;false表示應用
_FILEDETAIL結構,在響應DSPSpider的訊息中會傳遞的結構
strPathname -- 包含路徑的檔名,這個變數是隻讀的,不能改變
strFilename -- 不包含路徑的檔名,這個變數是隻讀的,不能改變
dwFilesize -- 當前檔案的位元組個數
nFileID -- 檔案的ID,用來標識唯一的檔案,只作為參考值,如不想設定ID,可設定為0
bRun -- 是否繼續接收或傳送,該值為true時,表示繼續;為false時,表示中止當前過程
hwnd -- 接收訊息的窗體的控制程式碼
DSPSpider中的屬性和函式說明
型別:屬性
定義:D m_dwErrorCode
描述:錯誤程式碼,在出現錯誤時,該變數儲存了錯誤程式碼,說明錯誤的原因
型別:屬性
定義:bool m_bExistQuery
描述:檔案存在時是否詢問重寫,如果值為false,則表示檔名存在時,不再下載該檔案,而是結束。
型別:屬性
定義:bool m_bCrc
描述:是否要進行校驗。為true時,表示要進行CRC校驗;false時,則不進行CRC校驗
型別:屬性
定義:bool m_bInternet
描述:是否是Internet應用。為true時,表示資料要轉換為序處理;為false時,表示資料為位元組序處理
型別:靜態方法
定義:static void SetFilename(WPARAM wParam,CString& strPathname)
描述:在響應MSG_GETFILENAME訊息時,呼叫該方法,設定要傳送的檔案的包含路徑的檔名。
型別:靜態方法
定義:static bool GetCompleteInfo(int which,CString& str)
描述:在響應MSG_SENDCOMPLETE訊息中,可以呼叫該方法,得到過程中止的原因的文字描述。
引數:which -- MSG_SENDCOMPLETE訊息中的lParam引數
str -- 儲存文字描述的字串
返回:true -- 檔案已經全部下載完成
false -- 檔案還未下載完成,下載過程被中止
型別:靜態方法
定義:static UINT ListenThread(LPVOID lpData)
描述:監聽執行緒
引數:lpData -- 指向DSPSpider::_SENDTHREADPARAM結構的指標
結構中的pCWnd引數,儲存了響應MSG_GETFILENAME訊息的窗體的指標
結構中的bInternet引數,表示監聽埠號是網路序還是位元組序
結構中的pFunc引數,表示處理監聽響應的函式的指標
型別:訊息處理函式
定義:LRESULT OnSendComplete(WPARAM wParam, LPARAM lParam)
描述:在響應MSG_SENDCOMPLETE的訊息中,必需呼叫該方法。
型別:訊息處理函式
定義:LRESULT OnUpdateSect(WPARAM wParam, LPARAM lParam)
描述:在響應MSG_RECVSECT的訊息中,必需呼叫該方法。
型別:訊息處理函式
定義:LRESULT OnAssignNewSect(WPARAM wParam, LPARAM lParam)
描述:在響應MSG_ASSIGNNEWSECT的訊息中,必需呼叫該方法。
型別:訊息處理函式
定義:LRESULT OnAbort(WPARAM wParam, LPARAM lParam)
描述:當接收方想在接收過程中中止整個接收過程時,呼叫該方法。
引數:wParam -- 值為0
lParam -- 值為0
返回:0 -- 表示接收過程正準備中止,但接收執行緒還未全部中止
1 -- 表示接收過程已經全部中止
型別:訊息處理函式
定義:LRESULT OnCreateRecvThread(WPARAM wParam, LPARAM lParam)
描述:在響應MSG_CREATERECVTHREAD的訊息中,必需呼叫該方法
型別:方法
定義:void SafeRelease()
描述:釋放資源,該方法在DSPSpider登出前應保證被呼叫一次
型別:方法
定義:BOOL AddIP(const char *lpSrvIP,WORD wPort,WORD nPriority=0)
描述:增加一個可以用來下載的IP
引數:lpSrvIP -- 可以下載檔案的IP或域名
wPort -- IP的監聽埠號
nPriority -- 加權值,加權值越小,將優先下載。
返回:true -- 正確新增。IP可以被重複增加,重複增加同一個IP,表示同時從該IP建立多個執行緒下載
false -- 該IP錯誤,無法得到正確的IP地址
特點:所有的IP按優先權排序,採用二分法插入。一個IP只能建立一個執行緒。
型別:方法
定義:void RemoveIP(const char *lpSrvIP)
描述:取消一個用來下載的IP
引數:lpSrvIP -- 可以下載檔案的IP或域名
型別:方法
定義:BOOL RunSpider(const char* lpFilename,const char* lpPathname,HWND hWnd,BYTE byThreadCount,int nFileID=0);
描述:準備採用多執行緒接收一個檔案
引數:lpFilename -- 要下載的檔名,不包含路徑名
lpPathname -- 要下載的檔名,包含路徑名
hWnd -- 響應接收方訊息的窗體的控制程式碼
byThreadCount -- 需要同時下載的執行緒的個數
nFileID -- 檔案的ID
型別:方法
定義:DWORD GetProgressStep()
描述:得到步進的步長
型別:方法
定義:DWORD GetCurrSize()
描述:得到當前已經下載的長度
源下載:_3/dsp_sample.rar">
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-960987/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 水晶報表官方例項下載:報表和應用程式 (轉)
- ASP環境下輕鬆實現報表的列印 (轉)
- XML輕鬆學習手冊(6)XML例項解析(轉)XML
- TextView自定義輕鬆實現下劃線、點選彈框TextView
- 妙用WPS 輕鬆實現跨文件應用格式刷
- 輕鬆實現刪除確認 (轉)
- tomcat下多個埠,多個應用(轉載)Tomcat
- 常見下載方式之BT下載實現過程詳解
- 輕鬆實現.NET應用自動更新:AutoUpdater.NET教程
- 如何透過 Rancher 輕鬆實現多雲部署
- 輕鬆實現session的mysql處理 (轉)SessionMySql
- JNPF讓你輕鬆點亮報表應用技能
- 用Redis輕鬆實現秒殺系統Redis
- 用 Redis 輕鬆實現秒殺系統Redis
- 實現FTP多執行緒下載 (轉)FTP執行緒
- 應用例項:VC++實現廣告視窗自動關閉(轉)C++
- ChianStore區塊鏈應用商店_讓小白也能輕鬆下載區塊鏈應用區塊鏈
- 在ECS上輕鬆搭建RDS的從例項
- 基本複製應用例項(轉)
- 透過SDK函式實現WIN32應用程式的唯一例項。 (轉)函式Win32
- JavaWeb之實現檔案上傳與下載例項JavaWeb
- 輕鬆搭建基於 Serverless 的 Go 應用(Gin、Beego 舉例)ServerGo
- [轉]Android輕鬆實現RecyclerView懸浮條AndroidView
- 輕鬆實現SINDOWS 98動態選單 (轉)
- js實現開啟應用程式程式碼例項JS
- jQuery實現的JSONP應用程式碼例項jQueryJSON
- 輕鬆開發多語言程式 (轉)
- ajax應用實現iframe高度自適應程式碼例項
- 用 Algolia DocSearch 輕鬆實現文件全站搜尋Go
- 利用Docker輕鬆實現雲原生應用-高可用架構設計Docker架構
- 用原生 JS 實現雙向繫結及應用例項JS
- 轉化成Access檔案下載的例項
- 輕鬆部署 Laravel 應用 | 《開篇》Laravel
- Diffutoon下載介紹:真人影片轉動漫工具,輕鬆獲得上千點贊
- 輕鬆實現報表整合
- 官方水晶報表 .NET 應用程式例項下載 (C#、Visual C++.NET) (轉)C#C++
- 華為雲全球首發容器多雲和混合雲解決方案,實現容器應用輕鬆跨雲
- 在ASP.NET裡輕鬆實現縮圖 (轉)ASP.NET