DSP應用例項(一)--輕鬆實現BT多點下載 (轉)

gugu99發表於2007-08-16
DSP應用例項(一)--輕鬆實現BT多點下載 (轉)[@more@]

  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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章