您的位置:首页 > 理论基础 > 计算机网络

远程下载http文件--利用WinInet类(转)

2007-03-24 12:09 513 查看
利用WinInet类下载http文件

1、直接socket实现http下载

此方法实现太复杂,需要非常熟悉tcp/ip协议栈,短时间很难实现稳定下载。

2、Windows API的URLDownloadToFile

这个方法是最简单,一个函数就搞定一切。

但是缺点也很多:

函数依赖IE。还好,从IE3.0就已经开始支持这个函数功能,而且IE是捆绑Windows的,所以这个缺点可以忽略。

实现进度条困难。虽然有一个回调函数可以解决这个问题,需要重载一个模板类。

最大的缺点是太简单,下载过程不能很好控制,稳定性跟IE一样……

3、利用WinInet

协议支持HTTP/FTP/Gopher,实现简单,过程可控,是最佳选择。

下面是一个简单的实现代码:

//创建 CInternetSession对象,初始化WinInet,并连接服务器

m_pInetSession=new CInternetSession(NULL
,1
,INTERNET_OPEN_TYPE_PRECONFIG,
NULL,
NULL,
INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
//设置参数

m_pInetSession->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT,1000,1);
m_pInetSession->SetOption(INTERNET_OPTION_CONNECT_BACKOFF,1000);
m_pInetSession->SetOption(INTERNET_OPTION_CONNECT_RETRIES,1);
//打开URL文件,返回CStdioFile
pSFile = m_pInetSession->OpenURL(http://hd61.15150.com/music/2006_8_6/212030_165807_05152.mp3
//缓冲区
BYTE pBuf[1024] = {NULL};
CFile pCFile = NULL;
//创建本地文件
pCFile.Open("c://1.mp3",
CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
//从缓冲区循环读取文数据
while (int bytesread = pSFile->Read(pBuf,1024))
{
//指针移到文件结尾
pCFile.SeekToEnd();
//将读取的缓冲区数据写入本地文件
pCFile.Write(pBuf,bytesread);
}
//关闭本地文件
pCFile.Close();
//关闭CStdioFile
pSFile->Close();
}
catch(CInternetException* lpEx)
{
lpEx->ReportError();
lpEx->Delete();
delete m_pInetSession;
}
AfxMessageBox("下载完成");

另参见:);

http://www.codeproject.com/internet/simplehttpclient.asp

http://www.codeproject.com/internet/OfflineBrowserWinInet.asp

http://dev.csdn.net/author/hitjinming/56766bc47e3e445da0f268f6c41d5e48.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: