分享
 
 
 

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

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有