c++如何下载网上数据

97 阅读1分钟



// ConsoleApplication3.cpp : 定义控制台应用程序的入口点。
//
//define _WIN32_WINNT 0x0502
#include "stdafx.h"
#include"windows.h"
#include <iostream>
using namespace std;
#define RECVPACK_SIZE 2048

bool DownloadSaveFiles(const char* url, const char* strSaveFile) {//下载文件并保存为新文件名
bool ret = false;
CInternetSession Sess(_T("lpload"));//这个在头文件afx.h里面
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 5000); //5秒的连接超时
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 5000); //5秒的发送超时
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 5000); //5秒的接收超时
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 5000); //5秒的发送超时
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); //5秒的接收超时
DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD;

 CHttpFile* cFile = NULL;
char      *pBuf = NULL;
int nBufLen = 0;
do {
try{
cFile = (CHttpFile*)Sess.OpenURL((CString)url, 1, dwFlag);
DWORD dwStatusCode;
cFile->QueryInfoStatusCode(dwStatusCode);
if (dwStatusCode == HTTP_STATUS_OK) {
//查询文件长度
DWORD nLen = 0;
cFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, nLen);
//CString strFilename = GetFileName(url,TRUE);
nBufLen = nLen;
//cout << "nLen=" << nLen << endl;
if (nLen <= 0) break;//

    //分配接收数据缓存
pBuf = (char*)malloc(nLen + 8);
ZeroMemory(pBuf, nLen + 8);

    char *p = pBuf;
while (nLen>0) {
//每次下载8K
int n = cFile->Read(p, (nLen<RECVPACK_SIZE) ? nLen : RECVPACK_SIZE);
//接收完成退出循环
if (n <= 0) break;//
//接收缓存后移
p += n;
//剩余长度递减
nLen -= n;
//cout << "nLen=" << nLen << endl;
}

    //如果未接收完中断退出
if (nLen != 0) break;

    //接收成功保存到文件

    CFile file((CString)strSaveFile, CFile::modeCreate | CFile::modeWrite);
file.Write(pBuf, nBufLen);
file.Close();
ret = true;
}
}
catch (...) {
cout << "异常" << endl;
break;//
}
} while (0);

 //释放缓存
if (pBuf) {
free(pBuf);
pBuf = NULL;
nBufLen = 0;
}

 //关闭下载连接
if (cFile) {
cFile->Close();
Sess.Close();
delete cFile;
}
return ret;
}

int _tmain(int argc, _TCHAR* argv[])
{
//测试用例
if (DownloadSaveFiles("nj02all01.baidupcs.com/file/610c51…", "f:/help.exe") == true)
{
cout << "下载成功" << endl;
}
else{
cout << "下载失败" << endl;
}

 return 0;
}

\