看了一下wininet编程,底层实现其实封装了socket套接字,连接到服务器端口80,填充TCP数据部分作为HTTP协议的报头,然后SEND出去,等待recv的数据。
直接上代码吧
// 文件下载 CONSOLE.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <stdio.h>
#include <Windows.h>
#include <Windowsx.h>
#include<string>
#include "wininet.h" //包含wininet.h文件
using namespace std;
#define MAXBLOCKSIZE 200000
#pragma comment( lib, "Wininet.lib" ) //连接到wininet.lib库
void download();
int _tmain(int argc, TCHAR* argv[]){
download();
return 0;
}
/**
* 执行 文件下载 操作
* @param Url: The target action url
*
*/
void download()
{
FILE *stream=NULL;
fopen_s( &stream,"c:\\test.jpg", "wb" ) ;//这里只是个测试
HINTERNET hSession = InternetOpen(_T("Internet Explorer"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0); //打开internet会话 返回根句柄
HINTERNET hConnect=NULL;
HINTERNET hRequest=NULL;
if (hSession != NULL)
{
HINTERNET handle2 = InternetOpenUrl(hSession,_T("http://58.218.199.175/VS4.1.rar"),NULL, 0,INTERNET_FLAG_DONT_CACHE, 0); //打开URL所指的文件,返回文件句柄这里以下载一个 VS游戏平台为例子
DWORD dwBytesStreamFile=0;
DWORD dwIndex;
DWORD BufLen=8;
DWORD RetQueryInfo=HttpQueryInfo(handle2,HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER,(LPVOID)&dwBytesStreamFile, &BufLen,NULL);//查询报头中的信息,如文件长度。 //HTTP_QUERY_FLAG_NUMBER 参数必不可少 否则可能因为字符串编码问题接受不到正确的大小。
printf("%lu",dwBytesStreamFile);
if (handle2 != NULL)
{
byte Temp[MAXBLOCKSIZE];
ULONG Number = 1;
if(stream==NULL)
printf("NULL File");
while (Number > 0)
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
//fprintf(stream, (const char*)Temp);
fwrite(Temp, sizeof (char), Number , stream);
}
fclose( stream );
}
InternetCloseHandle(handle2);
handle2 = NULL;
InternetCloseHandle(hSession);
hSession = NULL;
}
}
1579




被折叠的 条评论
为什么被折叠?



