DSP应用实例(一)--轻松实现BT多点下载

类别:VC语言 点击:0 评论:0 推荐:

                      DSP应用实例(一)--轻松实现BT多点下载
                     
       BitTorrent----简称"BT"下载,是现在最流行的下载方式,它的主要特点就是多IP下载,一个文件可以从多个IP被同时下载,使下载速度达到极限。
      在这个数据包里提供了一个标准的DSPSpider类,使用该类可以轻松实现BitTorrent多点下载。在采用BitTorrent和FlashGet下载时,需要预先对磁盘进行扫描生成整个文件的索引后,才会正式开始下载文件,当文件很大时,文件的创建时间会较长,使系统像死机了一样,实际是在创建文件。DSPSpider采用了更先进的方式,在下载文件前无需对磁盘进行扫描,文件采用动态创建,随着下载的完成度而逐步增加,并且下载过程中不需要额外创建任何附加的文件。这次发布的为debug版,正式版中将包含有更多、更完善的功能。
    
    只需在窗体中响应以下7个消息,就可以轻松实现BT多点下载。
    1   MSG_RECVSECT            接收方消息
        接收到了一部分数据,每接收到一部分数据时,就会向指定窗体发送该消息。
        必需调用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,则表示连接方的IP地址的字符串表示
       
    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消息。
        bInternet     --  是否是Internet应用,true表示Internet应用;false表示局域网应用


    _FILEDETAIL结构,在响应DSPSpider的消息中会传递的结构
        strPathname  --  包含路径的文件名,这个变量是只读的,不能改变
        strFilename   --  不包含路径的文件名,这个变量是只读的,不能改变
        dwFilesize    --  当前文件的字节个数
        nFileID        --  文件的ID,用来标识唯一的文件,只作为参考值,如不想设定ID,可设置为0
        bRun           --  是否继续接收或传送,该值为true时,表示继续;为false时,表示中止当前过程
        hwnd          --  接收消息的窗体的句柄
       
       
       
                            DSPSpider中的属性和函数说明
       
    类型:属性
    定义:DWORD 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()
    描述:得到当前已经下载的长度

 

    源程序下载:http://www.copathway.com/vchelp/file2003_3/dsp_sample.rar

本文地址:http://com.8s8s.com/it/it1559.htm