转】WinINet写的网络下载程序(1)---InternetOpenUrl(非标准的8层)

转】WinINet写的网络下载程序(1)---InternetOpenUrl(非标准的8层)

--------------创建win32控制台应用程序,直接复制代码即可用(已通过VS2003与VS2008测试--------------

#include "stdafx.h"

#include <iostream>
using namespace std;
#include <string.h>

#include "winsock2.h"
#pragma comment(lib, "WS2_32") //为确保安全,最好包含进去
#include "Wininet.h" //注意包含wininet.h之前,一定要包含winsock2.h,否则报错
#pragma comment (lib,"Wininet.lib")


int _tmain(int argc, _TCHAR* argv[])
{



DWORD dwFlags;
InternetGetConnectedState(&dwFlags, 0);//参数1:当函数正确时,参数1会得到当前的网络连接信息---详见备注1
CHAR strAgent[64];
HINTERNET hOpen;
if(!(dwFlags & INTERNET_CONNECTION_PROXY))//参数1为真.当使用代理时(!真=假,跳到else语句)
   hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG_WITH_NO_AUTOPROXY, NULL, NULL, 0);//用来打开一个网络连接,但不要使用自动代理
else
   hOpen = InternetOpenA(strAgent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(!hOpen)//dwFlags并没证明是否正确,InternetOpenA也没证明是否正确,此处质检一一检查
{
   MessageBox(0,"Internet连接错误!","MB_OK",0);
   return 0;
}

DWORD dwSize;
CHAR   szHead[] = "Accept: */*\r\n\r\n";
VOID* szTemp[16384];
HINTERNET hConnect;

/从此步开始是CFile领域
// CFile hFile;


if ( !(hConnect = InternetOpenUrlA ( hOpen, "http://192.168.1.141/1.mp3", szHead,
   lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0)))
{
   MessageBox(0,"不能打开该URL!","MB_OK",0);
   return 0;
}

HANDLE hFile=CreateFile("c:\\1.mp3",GENERIC_WRITE,0,0,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

DWORD dwByteToRead = 0;
DWORD dwSizeOfRq = 4;
DWORD dwBytes = 0;

if (!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,
   (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL))
{
   dwByteToRead = 0;
}


DWORD time;
string tempstring;
time = 10;

do
{
   if (!InternetReadFile (hConnect, szTemp, 16384, &dwSize))
   {
    MessageBox(0,"读文件出错!","MB_OK",0);
    CloseHandle(hFile);
    return 0;
   }
   if (dwSize==0)
    break;//当传送完毕时,自动退出死循环
   else
   ///WriteFile部分//
   {
    WriteFile(hFile,szTemp,dwSize,&dwBytes,0);
   }

}while (TRUE);//死循环.除非从里面关闭

CloseHandle(hFile);//之前用了Open,配套的关闭
InternetCloseHandle(hOpen);//当用完网络函数后,要用此函数关闭


return 0;
}

-------------------------------------------------------------------------------------------------------------------

附注1:代码已上传至邮箱,即取即用,注:本代码移植性高,直接拷贝即能用

附注2:一共写了2个不同版本,一个是可以下载百度歌曲的网络下载,详见本博客<<第5章 基本网络编程实例>>,一个是工作需要写的一个,原理上是一样的,但是代码还是有些区别

附注3:此问题已解决,为什么百度MP3有些MP3下载不了?那种封锁的不准盗链的除外,此处讲的是允许下载的

允许下载的,字符编码不一样,会造成下载不成功,因为VC写的CMD是GB字符格式,而有的网站不支持GB,而用UTF-8(即unicode),解决方法:是网站服务器方面支持GB格式转换成UTF-8即可

另外,注意的一点是英文字母不需要转换,转换的是汉字

附注4:2010.11.19日,扩展中涉及到多线程断点续传,所以开始采用标准wininet8层,详见本博客<<WinINet写的网络下载程序(2)---标准的8层 >>

转自:http://hi.baidu.com/cgclj/item/3f807827abb4f3cba5275ab1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值