C++实现HTTP下载

yufengbei 2012-05-16 10:49:18
哪位大牛知道C++(客户端)怎么实现利用HTTP协议从服务器端下载多个文件(文件名已经知道)啊?谢谢
...全文
2846 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
空虚大师 2013-07-19
  • 打赏
  • 举报
回复
有开源的啊, https://github.com/avplayer/avhttp 这个不错啊, 我就用在项目里面, 可以断点续传, 还支持代理什么的.
zhousitiaoda 2013-07-18
  • 打赏
  • 举报
回复
最原始方法直接用socket。。
飞机在流浪 2013-07-18
  • 打赏
  • 举报
回复
直接用urldwonloadtofile就OK了,其实
生活笔记 2013-06-23
  • 打赏
  • 举报
回复
感谢各位大神! C++小菜一个!
赵4老师 2013-01-30
  • 打赏
  • 举报
回复
剽窃二楼代码!VC6下编译链接运行测试通过版:
#include <afx.h>
#include <afxinet.h>
#define RECVPACK_SIZE 2048
bool DownloadSaveFiles(char* url,char *strSaveFile) {//下载文件并保存为新文件名
    bool ret=false;
    CInternetSession Sess("lpload");
    Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT     , 2000); //2秒的连接超时
    Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT        , 2000); //2秒的发送超时
    Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT     , 2000); //2秒的接收超时
    Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT   , 2000); //2秒的发送超时
    Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超时
    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(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;
                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 ;
                }

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

                //接收成功保存到文件

                CFile file(strSaveFile, CFile::modeCreate | CFile::modeWrite);
                file.Write(pBuf,nBufLen);
                file.Close();
                ret = true;
            }
        } catch(...) {
            break;//
        }
    } while(0);

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

    //关闭下载连接
    if (cFile) {
        cFile->Close();
        Sess.Close();
        delete cFile;
    }
    return ret;
}
int main() {
    DownloadSaveFiles("http://www.nirsoft.net/utils/nircmd.zip","d:\\cppdld_nircmd.zip");
    return 0;
}
雪碧透心凉_ 2013-01-30
  • 打赏
  • 举报
回复
QHttp可以实现。
china_jeffery 2013-01-30
  • 打赏
  • 举报
回复
CUrl开源库
小灬枫 2013-01-29
  • 打赏
  • 举报
回复
RECVPACK_SIZE 哪里定义的
一叶之舟 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
请问CHttpFile,CInternetSession等等类都是需要包含什么头文件啊?我不允许用MFC
[/Quote]

#include <afxinet.h>
xiaoxu 2012-05-16
  • 打赏
  • 举报
回复
urldownloadtofile函数实现从HTTP指定的URL地址下载到指定的目录下,很简单,一般网游资源更新也是这样下载的
笨笨周0915 2012-05-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

请问CHttpFile,CInternetSession等等类都是需要包含什么头文件啊?我不允许用MFC
[/Quote]

不要用MFC,用CInternetSession 相关的API函数也行的
liangbch 2012-05-16
  • 打赏
  • 举报
回复
直接调用wget吧,简单方便。
yufengbei 2012-05-16
  • 打赏
  • 举报
回复
请问CHttpFile,CInternetSession等等类都是需要包含什么头文件啊?我不允许用MFC
一叶之舟 2012-05-16
  • 打赏
  • 举报
回复

//下载文件并保存为新文件名
bool DownloadSaveFiles(char* url,char *strSaveFile)
{
bool ret=false;
CInternetSession Sess("lpload");
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, 2000); //2秒的连接超时
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT, 2000); //2秒的发送超时
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT, 2000); //2秒的接收超时
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT, 2000); //2秒的发送超时
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超时
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(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;
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 ;
}

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

//接收成功保存到文件

CFile file(strSaveFile, CFile::modeCreate | CFile::modeWrite);
file.Write(pBuf,nBufLen);
file.Close();
ret = true;
}
}
catch(...)
{
break;
}
}while(0);

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

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

例子
DownloadSaveFiles("http://www.destd111/123.zip","C:/123.zip")
下载保存为C:/123.zip
东莞某某某 2012-05-16
  • 打赏
  • 举报
回复
URL要知道吧 网上很多源码
零资源分下载,分享精神至上~ 一个综合型的Direct3D示例程序,用键盘上W,A,S,D,I,J,K,L,↑,↓,←,→12个键加上鼠标在美丽的三维空间中翱翔。包括了Direct3D初始化,DirectInput输入处理,顶点缓存,光照与材质,文字输出,颜色,纹理贴图,四大变换,网格模型,X文件载入等等知识(当然还有默认被开启的深度缓存)。 其中的3D人物模型使用的是PS3版《真三国无双6》中的王元姬 ,一袭蓝衣,很美。 背景音乐为雅尼的《兰花》。 源码的配套博文是 《【Visual C++】游戏开发笔记四十七 浅墨DirectX教程十五 翱翔于三维世界:摄像机的实现》 ,文章地址为http://blog.csdn.net/zhmxy555/article/details/8657656, 点击Debug下的exe文件可以直接看到运行效果,运行需要DirectX运行库的支持。报缺少D3D的DLL系列错误的童鞋们请google/百度一下 “DirectX 9.0c runtime”,下载并装个最新版的。 报缺少MVCR100D.Dll错误的朋友们去下一个安装就可以了,或者直接点击sln打开工程再次编译一次。 如果是想调试并运行源代码,但是报错了,请去下载最新版DirectX SDK并进行DirectX开发环境的配置。 编写环境:VS2010 我的博客地址是http://blog.csdn.net/zhmxy555,源码结合配套文章一起看效果更佳。 希望能和大家一起交流,共同学习,共同进步。 by浅墨

24,861

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧