编写断点续传和多线程下载模块
http://tech.ddvip.com 2006年07月13日 社区交流
本文详细介绍编写断点续传和多线程下载模块
首先建立一个名为THttpGetThread、创建后自动挂起的线程模块,我希望线程在完成后自动销毁,所以在构造函数中设置:
FreeOnTerminate = True; // 自动删除
并增加以下成员变量:
char Buffer[HTTPGET_BUFFER_MAX+4]; // 数据缓冲区
AnsiString FURL; // 下载对象的URL
AnsiString FOutFileName; // 保存的路径和名称
HINTERNET FhSession; // 会话句柄
HINTERNET FhConnect; // http连接句柄
HINTERNET FhRequest; // http请求句柄
bool FSuccess; // 下载是否成功
int iFileHandle; // 输出文件的句柄
1、建⒘?lt;/p>
按照功能划分,下载过程可以分为4部分,即建立连接、读取待下载文件的信息并分析、下载文件和释放占用的资源。建立连接的函数如下,其中ParseURL的作用是从下载URL地址中取得主机名称和下载的文件的WEB路径,DoOnStatusText用于输出当前的状态:
//初始化下载环境
void THttpGetThread::StartHttpGet(void)
{
AnsiString HostName,FileName;
ParseURL(HostName, FileName);
try
{
// 1.建立会话
FhSession = InternetOpen("http-get-demo",
INTERNET_OPEN_TYPE_PRECONFIG,
NULL,NULL,
0); // 同步方式
if( FhSession==NULL)throw(Exception("Error:InterOpen"));
DoOnStatusText("ok:InterOpen");
// 2.建立连接
FhConnect=InternetConnect(FhSession,
HostName.c_str(),
INTERNET_DEFAULT_HTTP_PORT,
NULL,NULL,
INTERNET_SERVICE_HTTP, 0, 0);
if(FhConnect==NULL)throw(Exception("Error:InternetConnect"));
DoOnStatusText("ok:InternetConnect");
// 3.初始化下载请求
const char *FAcceptTypes = "*/*";
FhRequest = HttpOpenRequest(FhConnect,
"GET", // 从服务器获取数据
FileName.c_str(), // 想读取的文件的名称
"HTTP/1.1", // 使用的协议
NULL,
&FAcceptTypes,
INTERNET_FLAG_RELOAD,
0);
if( FhRequest==NULL)throw(Exception("Error:HttpOpenRequest"));
DoOnStatusText("ok:HttpOpenRequest");
// 4.发送下载请求
HttpSendRequest(FhRequest, NULL, 0, NULL, 0);
DoOnStatusText("ok:HttpSendRequest");
}catch(Exception &exception)
{
EndHttpGet(); // 关闭连接,释放资源
DoOnStatusText(exception.Message);
}
}
// 从URL中提取主机名称和下载文件路径
void THttpGetThread::ParseURL(AnsiString &HostName,AnsiString &FileName)
{
AnsiString URL=FURL;
int i=URL.Pos("http://");
if(i>0)
{
URL.Delete(1, 7);
}
i=URL.Pos("/");
HostName = URL.SubString(1, i-1);
FileName = URL.SubString(i, URL.Length());
}
责编:豆豆技术应用