📄 dsp_sdk_.txt
字号:
类型:protected虚函数,派生类对象必需重载该函数
定义:virtual bool UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen)
参数:byClassLevels -- 类的深度
byAttrNo -- 当前操作的属性的序号
dsp -- 进行序列化操作的_DSPPACKET结构
返回:true --表示当前对象的属性已经全部还原完,该属性是对象的最后一个属性
false --表示当前对象的属性还没有全部还原完
描述:与Serialize()方法中的属性相对应,定义了对象中的哪些属性进行反序列化操作,这个方法在对象反序列化时会自动调用
举例:
bool DSPACT::UnSerialize(BYTE byClassLevels,BYTE byAttrNo,DSP::_DSPPACKET &dsp,DWORD dwLen)
{
//反序列化对象
if(byClassLevels>1)
return BaseObject::UnSerialize(byClassLevels-1,byAttrNo,dsp,dwLen);
else
{
switch(byAttrNo)
{
//属性的序号必需与Serialize()中的序号相对应
case 1: //得到第1个属性
if(dsp.Read(,dwLen))
{
//如果反序列化属性的函数返回真,则表示该属性的值已填充完成
}
return false;
case 2: //得到第2个属性
dsp.Read();
return false;
case 3: //得到最后一个属性
dsp.Read(,dwLen);
}
}
return true;
}
类型:protected虚函数,派生类对象必需重载该函数
定义:virtual bool Compress(char** const lpBuff,DWORD* pdwLen)
参数:lpBuff -- 在调用时,指向要压缩的数据缓冲区的指针,压缩后指向压缩数据的缓冲区的首址
pdwLen -- 在调用时,为要压缩的数据的字节个数,压缩后为压缩后的数据的字节数
返回:true --压缩程序有效;
false --压缩程序无效;
当压缩有效时,必需修改lpBuff为保存压缩后数据的缓冲区的指针,pdwLen地址内保存为压缩后的数据的长度
类型:protected虚函数,派生类对象必需重载该函数
定义:virtual bool UnCompress(char** const lpBuff,DWORD dwLen,char* lpUnBuff,WORD& wUnLen,bool bStart)
参数:lpBuff -- bStart==false时,需要将接收被压缩的数据缓冲区的首址保存在该地址中;
bStart==true时,保存被压缩的数据缓冲区的首址
dwLen -- 被压缩数据的缓冲区的长度
lpUnBuff -- bStart==true时,接收解压缩数据的缓冲区的首址
dwUnLen -- bStart==true时,接收解压缩数据的缓冲区的长度,在解压缩完成后,保存为解压缩数据的长度
bStart -- true,表示可以开始进行解压缩数据;
false,表示该次调用只是指定填充数据的缓冲区,缓冲区的长度不能小于dwLen;
返回:true --解压缩程序有效;
false --解压缩程序无效
如果设定缓冲区为NULL,则表示解压缩程序失败。
DSP应用实例(一)--轻松实现BT多点下载
BitTorrent----简称"BT"下载,是现在最流行的下载方式,它的主要特点就是多IP下载,一个文件可以从多个IP被同时下载,使下载速度达到极限。
在这个数据包里提供了一个标准的DSPSpider类,使用该类可以轻松实现BitTorrent多点下载。在采用BitTorrent和FlashGet下载时,需要预先对磁盘进行扫描生成整个文件的索引后,才会正式开始下载文件,当文件很大时,文件的创建时间会较长,使系统像死机了一样,实际是在创建文件。DSPSpider采用了更先进的方式,在下载文件前无需对磁盘进行扫描,文件采用动态创建,随着下载的完成度而逐步增加,并且下载过程中不需要额外创建任何附加的文件。这次发布的为debug版,正式版中将包含有更多、更完善的功能。
只需在窗体中响应以下6个消息,就可以轻松实现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()
描述:得到当前已经下载的长度
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -