使用libcurl下载文件小例

rainbow70626 rainbow70626     2022-09-21     356

关键词:

libcurl是一个很强大的开源网络处理库,支持包括HTTP、HTTPS、FTP……一系列网络协议。用它来进行HTTP的get\post 或者下载文件更是小菜一碟,chrome内核都用到了它,本文主要讲解一个使用curl下载文件的小例。

首先是去下载curl的最新源代码,然后编译成动态库或者静态库;然后把头文件和库文件拿出来加入到我们自己的工程中,引用声明:

#include "curl.h"  
#ifdef _DEBUG  
#pragma comment(lib, "../Debug/libcurld")  
#else  
#pragma comment(lib, "../Release/libcurl")  
#endif  

特意在原有代码上加了一些注释,希望可以更好理解,上代码:

<pre name="code" class="cpp">// UseLibCurl.cpp : 定义控制台应用程序的入口点。  
//  
  
#include "stdafx.h"  
#include <Windows.h>  
#include <CommCtrl.h>  
#include "resource.h"  
#include "curl.h"  
#ifdef _DEBUG  
#pragma comment(lib, "../Debug/libcurld")  
#else  
#pragma comment(lib, "../Release/libcurl")  
#endif  
  
  
//这个用来保存对话框的窗口句柄,因为后面要向这个窗口发消息,必须知道其窗口句柄  
HWND    g_hDlgWnd = NULL;  
//提供给CURL下载进度回调的函数,用于保存下载的数据到文件  
static size_t   DownloadCallback(void* pBuffer, size_t nSize, size_t nMemByte, void* pParam);  
//提供给CURL下载进度回调的函数,用于计算下载进度通知界面  
static int ProgressCallback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow);  
//这是对话框的消息循环,在控制台程序里面创建GUI,仅仅是为了更好地展现下载回调这个功能  
INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);  
//这个是下载的线程函数,为了不把对话框主界面卡死,肯定是要自己开线程来下载的了  
DWORD WINAPI DownloadThread(LPVOID lpParam);  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    //弹出对话框,知道对话框关闭才会执行退出  
    DialogBox(NULL, MAKEINTRESOURCE(IDD_DIALOG1), NULL, DialogProc );  
    return 0;  
}  
  
static size_t DownloadCallback(void* pBuffer, size_t nSize, size_t nMemByte, void* pParam)  
{  
    //把下载到的数据以追加的方式写入文件(一定要有a,否则前面写入的内容就会被覆盖了)  
    FILE* fp = NULL;  
    fopen_s(&fp, "c:\\test.apk", "ab+");  
    size_t nWrite = fwrite(pBuffer, nSize, nMemByte, fp);  
    fclose(fp);  
    return nWrite;  
}  
  
static int ProgressCallback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)  
{  
    if ( dltotal > -0.1 && dltotal < 0.1 )  
        return 0;  
    int nPos = (int) ( (dlnow/dltotal)*100 );  
    //通知进度条更新下载进度  
    ::PostMessage(g_hDlgWnd, WM_USER + 110, nPos, 0);  
    //::Sleep(10);  
    return 0;  
}  
  
INT_PTR CALLBACK DialogProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)  
{  
    switch( uMsg )  
    {  
    case WM_INITDIALOG:  
        {  
            g_hDlgWnd = hWnd;  
            HWND hProgress = GetDlgItem(hWnd, IDC_PROGRESS1);  
            SendMessage(hProgress, PBM_SETRANGE32, (WPARAM) 0, (LPARAM) 100);  
            //对话框初始化时创建下载线程  
            HANDLE hThread = CreateThread(NULL, 0, DownloadThread, 0, 0, NULL);  
            CloseHandle(hThread);  
            ::SetWindowText(hWnd, L"使用CURL下载文件示例:");  
            return TRUE;  
        }  
    case WM_COMMAND:  
        {  
            WORD  msg = HIWORD(wParam);  
            WORD  id  = LOWORD(wParam);  
            if ( id == IDOK || id == IDCANCEL )  
                EndDialog(hWnd, id);  
            break;  
        }  
    case WM_ERASEBKGND:  
        return TRUE;  
    case WM_CTLCOLORSTATIC:  
        return (INT_PTR)(HBRUSH)::GetStockObject(WHITE_BRUSH);  
    case WM_USER + 110:  
        {//接收到设置进度的消息  
            HWND    hProgress   = GetDlgItem(hWnd, IDC_PROGRESS1);  
            HWND    hStatus     = GetDlgItem(hWnd, IDC_STATUS);  
            if ( hProgress )  
                SendMessage(hProgress, PBM_SETPOS, wParam, 0L);  
            if ( hStatus )  
            {  
                WCHAR szBuffer[100] = {0};  
                if ( wParam<100 )  
                    swprintf(szBuffer, L"正在下载文件,进度:%d%%", wParam);  
                else  
                    swprintf(szBuffer, L"文件下载完毕!");  
                ::SetWindowText(hStatus, szBuffer);  
            }  
            return 0;  
        }  
    default:  
        break;  
    }  
    return DefWindowProc(hWnd, uMsg, wParam, lParam);  
}  
  
DWORD WINAPI DownloadThread(LPVOID lpParam)  
{  
    //初始化curl,这个是必须的  
    CURL* curl = curl_easy_init();  
    curl_easy_setopt(curl, CURLOPT_URL, "http://android.shoujids.com/software/download?id=154103");  
    //设置接收数据的回调  
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, DownloadCallback);  
    //curl_easy_setopt(curl, CURLOPT_INFILESIZE, lFileSize);  
    //curl_easy_setopt(curl, CURLOPT_HEADER, 1);  
    //curl_easy_setopt(curl, CURLOPT_NOBODY, 1);  
    //curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);  
    // 设置重定向的最大次数  
    curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);  
    // 设置301、302跳转跟随location  
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);  
    curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0);  
    //设置进度回调函数  
    curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, ProgressCallback);  
    //curl_easy_getinfo(curl,  CURLINFO_CONTENT_LENGTH_DOWNLOAD, &lFileSize);  
    //curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, g_hDlgWnd);  
    //开始执行请求  
    CURLcode retcCode = curl_easy_perform(curl);  
    //查看是否有出错信息  
    const char* pError = curl_easy_strerror(retcCode);  
    //清理curl,和前面的初始化匹配  
    curl_easy_cleanup(curl);  
    return 0;  
}  

原文链接:使用libcurl下载文件小例

linux下使用libcurl实现ftp单个文件上传下载功能

...在文章中发现代码错误或其它问题请告知,感谢!2.关于libcurl2.1简介libcurl是一个提供数据传输功能的函数库,主要功能就是通过其使用不同的协议连接不同类型的服务器。当前libcurl支持的协议主要有http,https,ftp,gopher,telnet,dict,fil... 查看详情

libcurl库的安装及使用说明(代码片段)

目录一  libcurl库安装①下载网址②libcurl库安装步骤③libcurl等第三方库的通用编译方法二  调用libcurl编程访问百度主页 ①代码说明②编译说明③执行说明三  libcurl的使用说明①curl相关函数简介 ② curl_easy_setopt函数部分选... 查看详情

带有libcurl的下载功能,但它的工作不完整[关闭]

】带有libcurl的下载功能,但它的工作不完整[关闭]【英文标题】:downloadfunctionwithlibcurl,butitworksincomplete[closed]【发布时间】:2019-03-2704:59:18【问题描述】:大家好,阅读这个话题,我的平台是win32。而且我在使用libcurl时遇到了问... 查看详情

请问大佬有libcurl.dll文件软件免费百度云资源吗

《libcurl.dll文件软件》百度网盘资源下载链接:https://pan.baidu.com/s/15gGJhAqvVK-GJPuhzOs3aA提取码:i8pb   软件名称:libcurl.dll文件语言:简体中文大小:324KB类别:系统工具介绍:libcurl.dll是一个系统中的一个dll文件,如果缺少这个文件... 查看详情

libcurl的初步实现tfp上传下载功能

该学习笔记的目标是利用libcurl实现ftp文件上传和下载功能一、Libcurlde的简单介绍Libcurl是一个免费的而且易于使用的利用url进行文件传输的库。,libcurl当前支持DICT,FILE,FTP,FTPS,Gopher,HTTP,HTTPS,IMAP,IMAPS,LDAP,LDAPS,POP3,POP3S,RTMP,RTSP,SCP,SFTP,SMT... 查看详情

c++多线程中使用libcurl库的问题

我想开启五个线程,从URL队列中读取URL,并使用libcurl库下载网页源码(每个源码存在一个对应的html文件里),但是五个线程间的互斥量设置问题不太了解。目前我只在读取URL的时候设置了互斥量,但在libcurl的使用中没有加互斥... 查看详情

使用curl,libcurl访问https

编译curl,libcurl下载curl源码(gitclonehttps://github.com/curl/curl),在目录curlwinbuildBUILD.WINDOWS.txt文件中,详细介绍了使用nmake编译windows下curl及libcurl库的相关命令,摘录如下:nmake/fMakefile.vcmode=<staticordll><options&g 查看详情

使用libcurl实现断点下载

关键部分代码如下:#include"curl.h"#pragmacomment(lib,"libcurl.lib") size_tCROS_DownloadDlg::getContentLengthFunc(void*ptr,size_tsize,size_tnmemb,void*stream){LONGLONGlen=0;intr=sscanf((constchar*)ptr,"Con 查看详情

[zlib]cmake+vs2015下编译zlib,及使用小例(代码片段)

...再访问。因为我在公司的网络是访问不了的。 我当前使用的是zlib1.2.11版本。下载好后,解压出来,看看根目录下有一个CMakeLists.txt,就证明可以用CMake创建VS的工程了。CMake创建工程把sourcecode和buildthebinaries的路径设置后好,... 查看详情

libcurl同时下载多个文件

#include<errno.h>#include<stdlib.h>#include<string.h>#ifndefWIN32#include<unistd.h>#endif#include<curl/multi.h>staticconstchar*urls[]={"http://www.microsoft.com","http:// 查看详情

计算机libcurl.dll文件丢失怎么解决

当运行软件或游戏时,系统提示“没有找到libcurl.dll”、“缺少libcurl.dll”等类似错误信息。请下载本站提供的dll文件,使用它可以帮助用户解决上述问题。dll文件修复方法:1、解压下载的libcurl.dll文件http://www.ddooo.com/softdown/21731... 查看详情

libcurl.dll怎么安装

楼主你好,你可以重新下载一个libcurl.dll文件文件,然后按如下步骤操作:一、解压后直接拷贝该文件到系统目录里:1、Windows95/98/Me系统,复制到C:\\Windows\\System目录下。2、WindowsNT/2000系统,复制到C:\\WINNT\\System32目录下。3、Window... 查看详情

libcurl.dll丢失怎么办libcurl.dll丢失解决方法

参考技术A当运行软件或游戏时,系统提示“没有找到libcurl.dll”、“缺少libcurl.dll”等类似错误信息。请下载本站提供的dll文件,使用它可以帮助用户解决上述问题。libcurl.dllhttp://www.ddooo.com/softdown/21731.htmdll文件修复方法:1、解... 查看详情

libcurl.dll怎么用

参考技术A楼主你好,你可以重新下载一个libcurl.dll文件文件,然后按如下步骤操作:一、解压后直接拷贝该文件到系统目录里:1、Windows95/98/Me系统,复制到C:\Windows\System目录下。2、WindowsNT/2000系统,复制到C:\WINNT\Syste... 查看详情

通过 libcurl 以二进制形式传输的文件已损坏

】通过libcurl以二进制形式传输的文件已损坏【英文标题】:Filetransferredasbinaryvialibcurliscorrupted【发布时间】:2019-11-1313:34:32【问题描述】:还有许多其他线程在谈论二进制文件损坏,但它们似乎都与我的问题无关。我有一个下载... 查看详情

libcurl.dll怎么恢复

先从网站下载下来libcurl.dll文件之后,先将其解压(一般都是rar压缩包),然后根据您系统的情况选择X86/X64,X86为32位电脑,X64为64位电脑。默认都是支持32位系统的。使用方法:1.直接拷贝该文件到系统目录里:1)Windows95/98/Me系统,... 查看详情

win10libcurl.dll丢失怎么办

...统文件,通常情况下是在安装操作系统过程中自动创win10libcurl.dll建的,对于系统正常运行来说至关重要。缺少win10libcurl.dlll解决步骤如下:搜索win10libcurl.dll,下载下来保存到桌面。解压文件,复制文件“msvcr110.dll”到系统目录C:... 查看详情

c++ libcurl json rest

】c++libcurljsonrest【英文标题】:【发布时间】:2011-08-0803:43:09【问题描述】:我正在尝试使用libcurl从C++中的REST网页下载json文件。如果我访问网页,以下代码可以工作,但如果我尝试访问json,它不会下载....我认为这应该是一个... 查看详情