1.前言

通过http下载文件比较普遍,这里简单列举两种方法.1.直接使用微软Internet系列api来实现较为简单,对windows环境依赖性较大,经过测试有少量用户无法进行正确下载 2.通过tcp模拟http文件下载,这个通用性较好

2.代码

1.Internet系列函数实现

bool downLoadFile(const TCHAR *Url, const TCHAR *ptFilePath)
{bool bret = false;HINTERNET hSession = InternetOpen(TEXT("RookIE/1.0"), INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);if (hSession != NULL){HINTERNET handle2 = InternetOpenUrl(hSession, Url, NULL, 0, INTERNET_FLAG_DONT_CACHE, 0);if (handle2 != NULL){byte Temp[MAXBLOCKSIZE] = {0};ULONG Number = 1;DWORD  dwBytesWritten ;HANDLE hFile;if (INVALID_HANDLE_VALUE != (hFile = CreateFile (ptFilePath, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL))){while (Number > 0){BOOL bRet = InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);WriteFile (hFile, Temp, Number * sizeof (byte), &dwBytesWritten, NULL);}CloseHandle(hFile);bret = true;}InternetCloseHandle(handle2);handle2 = NULL;}InternetCloseHandle(hSession);hSession = NULL;}return bret;
}

2.通过tcp模拟http文件请求

bool downTcpFile(const std::string &strurl, const std::string &strfilepath)
{bool bret = false;std::string strip("");int nport = 0;std::string strsenddata("");if (!strurl.empty() && !strfilepath.empty()){std::string strsuburl(""), strhost(""), strip(""), strport("80");int npos = strurl.find("http://");if (npos != -1)strhost = strurl.substr(npos + strlen("http://"));else{cout<<"ipmap.txt下载地址http非法"<<endl;return bret;}npos = strhost.find("/");if (npos != -1){strsuburl = strhost.substr(npos);strhost = strhost.substr(0, npos);}else{cout<<"ipmap.txt下载地址子域名非法"<<endl;return bret;}npos = strhost.find(":");if (npos != -1){strip = strhost.substr(0, npos);strport = strhost.substr(npos + 1);}elsestrip = strhost;char szbuf[1024] = {0};sprintf(szbuf, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", strsuburl.c_str(), strhost.c_str());INT             nret; SOCKADDR_IN     addr;SOCKET          Socket; Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);int nTvlen = 2000;setsockopt(Socket,SOL_SOCKET, SO_RCVTIMEO, (const char*)&nTvlen,sizeof(nTvlen));setsockopt(Socket,SOL_SOCKET, SO_SNDTIMEO, (const char*)&nTvlen,sizeof(nTvlen));if( Socket == INVALID_SOCKET ) {closesocket(Socket); return bret; }try{struct hostent *host;host = gethostbyname(strip.c_str());if (host != NULL){SOCKADDR_IN SockAddr;SockAddr.sin_port=htons(atoi(strport.c_str()));SockAddr.sin_family=AF_INET;SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){closesocket(Socket); return bret; }send(Socket, szbuf,strlen(szbuf), 0);std::string strdata("");int nrecv = 0;do {char szdata[4096] = {0};nrecv = recv(Socket, szdata, 4095, 0);if (nrecv > 0){strdata.append(szdata, nrecv);break;}} while (nrecv > 0);int npos = strdata.find("[alayun]");if (npos != -1){strdata = strdata.substr(npos);std::fstream ffile;ffile.open(strfilepath, std::ios_base::out);if (ffile.is_open())   {ffile<< strdata;ffile.close();}bret = true;}elsecout<<strdata<<endl;}elsecout<<""<<endl;closesocket(Socket);} catch (...){writelog("发送数据发生异常");}}elsewritelog("error in httppost");return bret;
}

3.说明

1.在win7+vs2010(命令行程序) 上测试正常
2.参考了一些网上的资料,不再枚举,向同行致敬
3.完整测试demo免费下载地址http://download.csdn.net/detail/zhang_ruiqiang/9484379

vc实现http文件下载相关推荐

  1. vc实现https文件下载

    不多说废话,直接上代码. .h文件 #pragma once class CDownloadHttps { public:CDownloadHttps();~CDownloadHttps();stat ...

  2. 详解HelloWorldBasic实例

    转载于:http://www.sm82.com/blog/article.asp?id=101 LeeFJ 翻译整理 Detail Of HelloWorldBasic Example About t ...

  3. vc下文件下载的两种方法

    文章中有使用到libcurl相关文件,请自行到官网下载编译后导入使用:下面示例仅供参考 #include "stdafx.h" #include <stdio.h> # ...

  4. SQLite VC环境搭建

    第一步:进入到SQLite的官网下载sqlite-amalgamation-3_7_2和sqlitedll-3_7_2这两个文件,我使用的版本是3.7的有兴趣的朋友可以将帮助文档下载下来,里面的内容很 ...

  5. [强]用VC++6.0编译调试汇编程序

    用VC++6.0编译调试汇编程序     使用汇编的一点心得,还不完善,希望高手指点. 第一步:新建工程     新建空的Win32控制台程序. 第二步:添加文件     把源程序和资源文件添加进新建 ...

  6. vc安装.zip_空间分析:4-1.分词模型hanLP简介与安装

    自然语言处理NLP相对来说,是比较火的方向,分词模型很多,选起来容易眼花缭乱,我最开始使用过结巴分词,简单易用.后来又看到了hanLP,介绍上说,它是用<人民日报>语料库训练的,深得我心, ...

  7. MFC 利用小型数据库Access 少步惆 教你用VC开发

     目录(?)[+] 情境一     面向对象基础应用 任务类的声明及成员的访问控制 任务构造函数和析构函数的应用 任务成员函数的应用 任务继承性的作用 任务函数的重载的应用 任务虚函数的使用 任务 ...

  8. BAT实现文件下载功能

    [Win]闲来无事之-记用BAT实现文件下载功能 闲来无事之--记用BAT(批处理脚本)实现文件下载功能 标题:闲来无事之--记用BAT(批处理脚本)实现文件下载功能 作者:ZV(ZVROP) 邮件: ...

  9. VC语言文件正文分析器--支持格式常用文件格式

    Graccvs文件正文提取开发组件支持各种文件提取正文,为OA,ERP,CRM系统使用文件提供文件正文使用和搜索,支持常见各种文件格式".pdf", ".doc" ...

最新文章

  1. antd checkbox 默认选中_antd 开发的一些坑(一)
  2. doxygen 注释规范_编程规范 - doxygen注释规范示例(C++)
  3. TF-IDF与余弦相似性的应用(一):自动提取关键词
  4. Collections工具类常用API使用示例
  5. 这是私人的事,法官大人
  6. 分享改进 高性能数据同步工具(一)
  7. Hive命名空间-自定义变量
  8. 【OCM】Oracle OCM11g考场合影~keep人生中重要时刻
  9. Failed to parse XML
  10. matlab指派问题论文,数学建模指派问题论文.doc
  11. 根据股票涨跌用KMeans进行分类
  12. asp.net 获得根文件夹在服务器上物理路径,asp.net获取网站目录物理路径示例
  13. 获取门店出错(44)美团聚宝盆 门店映射报错
  14. AsyncTask如何使用
  15. 远距离作战通信单兵系统
  16. 基于jquery拆分姓名的方法[纯javascript版]
  17. 阿里巴巴集团详细股权报告:马云持股8.9%
  18. HIWIN、IKO滑块HGH15CA、LWHD15B型号替换
  19. 梦柚科技:TikTok限流?教你爆款文案打造+热门背景音乐选择
  20. 基于Halcon学习的二维码识别【三】2d_data_codes_minimize_module_gaps.hdev

热门文章

  1. 【无标题】多语种平行语料数据,助力“一带一路”深入交流
  2. go-iris-websocket 简单聊天通信
  3. be2014备份oracle,BE 12.5在备份ORACLE的问题
  4. 递归巧解汉诺塔问题(hanoi)
  5. conda activate pytorch报错
  6. 传统节日春节习俗介绍主题班会PPT模板
  7. python 监控文件夹存入的文件_文件夹 python
  8. VUE ----父子组件通信
  9. am335x sd卡分区制作文档
  10. 一次性查询大量EMS快递单号的方法介绍