c++如何下载网上数据

来源:互联网 发布:如何给php代码加密 编辑:程序博客网 时间:2024/04/28 03:29


// 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("https://nj02all01.baidupcs.com/file/610c518897d2b2c2e926dea4ec3479aa?bkt=p3-1400610c518897d2b2c2e926dea4ec3479aa6b0ee2f1000000005400&fid=1385520889-250528-801743656234146&time=1473385355&sign=FDTAXGERBH-DCb740ccc5511e5e8fedcff06b081203-VIHi1jRLlJUxd4i0s9LsZ747jhM%3D&to=nj2hb&fm=Yan,B,T,t&sta_dx=21504&sta_cs=1&sta_ft=exe&sta_ct=1&sta_mt=1&fm2=Yangquan,B,T,t&newver=1&newfm=1&secfm=1&flow_ver=3&pkey=1400610c518897d2b2c2e926dea4ec3479aa6b0ee2f1000000005400&expires=8h&rt=sh&r=397272790&mlogid=5853974854801757197&vuk=1385520889&vbdid=3657123245&fin=helper.exe&fn=helper.exe&slt=pm&uta=0&rtype=1&iv=0&isw=0&dp-logid=5853974854801757197&dp-callid=0.1.1&hps=1&csl=0&csign=jq6%2BHtpAALBTzxw6VDBQA7h3fCY%3D", "f:/help.exe") == true)
 {
  cout << "下载成功" << endl;
 }
 else{
  cout << "下载失败" << endl;
 }

 return 0;
}


0 0
原创粉丝点击