vc实现http文件下载
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文件下载相关推荐
- vc实现https文件下载
不多说废话,直接上代码. .h文件 #pragma once class CDownloadHttps { public:CDownloadHttps();~CDownloadHttps();stat ...
- 详解HelloWorldBasic实例
转载于:http://www.sm82.com/blog/article.asp?id=101 LeeFJ 翻译整理 Detail Of HelloWorldBasic Example About t ...
- vc下文件下载的两种方法
文章中有使用到libcurl相关文件,请自行到官网下载编译后导入使用:下面示例仅供参考 #include "stdafx.h" #include <stdio.h> # ...
- SQLite VC环境搭建
第一步:进入到SQLite的官网下载sqlite-amalgamation-3_7_2和sqlitedll-3_7_2这两个文件,我使用的版本是3.7的有兴趣的朋友可以将帮助文档下载下来,里面的内容很 ...
- [强]用VC++6.0编译调试汇编程序
用VC++6.0编译调试汇编程序 使用汇编的一点心得,还不完善,希望高手指点. 第一步:新建工程 新建空的Win32控制台程序. 第二步:添加文件 把源程序和资源文件添加进新建 ...
- vc安装.zip_空间分析:4-1.分词模型hanLP简介与安装
自然语言处理NLP相对来说,是比较火的方向,分词模型很多,选起来容易眼花缭乱,我最开始使用过结巴分词,简单易用.后来又看到了hanLP,介绍上说,它是用<人民日报>语料库训练的,深得我心, ...
- MFC 利用小型数据库Access 少步惆 教你用VC开发
目录(?)[+] 情境一 面向对象基础应用 任务类的声明及成员的访问控制 任务构造函数和析构函数的应用 任务成员函数的应用 任务继承性的作用 任务函数的重载的应用 任务虚函数的使用 任务 ...
- BAT实现文件下载功能
[Win]闲来无事之-记用BAT实现文件下载功能 闲来无事之--记用BAT(批处理脚本)实现文件下载功能 标题:闲来无事之--记用BAT(批处理脚本)实现文件下载功能 作者:ZV(ZVROP) 邮件: ...
- VC语言文件正文分析器--支持格式常用文件格式
Graccvs文件正文提取开发组件支持各种文件提取正文,为OA,ERP,CRM系统使用文件提供文件正文使用和搜索,支持常见各种文件格式".pdf", ".doc" ...
最新文章
- antd checkbox 默认选中_antd 开发的一些坑(一)
- doxygen 注释规范_编程规范 - doxygen注释规范示例(C++)
- TF-IDF与余弦相似性的应用(一):自动提取关键词
- Collections工具类常用API使用示例
- 这是私人的事,法官大人
- 分享改进 高性能数据同步工具(一)
- Hive命名空间-自定义变量
- 【OCM】Oracle OCM11g考场合影~keep人生中重要时刻
- Failed to parse XML
- matlab指派问题论文,数学建模指派问题论文.doc
- 根据股票涨跌用KMeans进行分类
- asp.net 获得根文件夹在服务器上物理路径,asp.net获取网站目录物理路径示例
- 获取门店出错(44)美团聚宝盆 门店映射报错
- AsyncTask如何使用
- 远距离作战通信单兵系统
- 基于jquery拆分姓名的方法[纯javascript版]
- 阿里巴巴集团详细股权报告:马云持股8.9%
- HIWIN、IKO滑块HGH15CA、LWHD15B型号替换
- 梦柚科技:TikTok限流?教你爆款文案打造+热门背景音乐选择
- 基于Halcon学习的二维码识别【三】2d_data_codes_minimize_module_gaps.hdev