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