`
dewei
  • 浏览: 164454 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

VC++调用libcurl的VC库使用详解

 
阅读更多

1、下载官方库。

地址:http://curl.haxx.se/download.html#Win32  下载  Win32 - MSVC,下面有两个版本的库,一个是带ssl的,一个是不带ssl的。

不带ssl的:http://curl.haxx.se/download/libcurl-7.18.0-win32-msvc.zip

带ssl的:http://curl.haxx.se/download/libcurl-7.19.3-win32-ssl-msvc.zip

 

2、在VS2010中VC++目录中加入从zip中解压的include目录,和lib目录

 

3、使用方法为,注意还有debug和Release两种库

#include <curl/curl.h>
//不带SSL
#pragma comment(lib, "libcurl.lib")
//带SSL
#pragma comment(lib, "libcurl_imp.lib")
 

4、 下面是我写的用于http和https的学习记录

// libcurl http和https学习记录 2012-6-30 by Dewei
//

#include "stdafx.h"
#include <string>
#include <iostream>
#include <assert.h> 
#include "curl/curl.h"
#pragma comment(lib, "libcurl_imp.lib")

#define  SKIP_PEER_VERIFICATION 1
//#define  SKIP_HOSTNAME_VERFICATION 1

/*
ptr是指向存储数据的指针,
size是每个块的大小,
nmemb是指块的数目,
stream是用户参数。
所以根据以上这些参数的信息可以知道,ptr中的数据的总长度是size*nmemb
*/
size_t call_wirte_func(const char *ptr, size_t size, size_t nmemb, std::string *stream)
{
    assert(stream != NULL);
    size_t len  = size * nmemb;
    stream->append(ptr, len);
    return len;
}
// 返回http header回调函数  
size_t header_callback(const char  *ptr, size_t size, size_t nmemb, std::string *stream)  
{  
    assert(stream != NULL);
    size_t len  = size * nmemb;
    stream->append(ptr, len);
    return len;
}  

int _tmain(int argc, _TCHAR* argv[])
{


    CURL *curl;
    CURLcode code;
    std::string szbuffer;
    std::string szheader_buffer;
    char errorBuffer[CURL_ERROR_SIZE];
    std::string url = "http://www.douban.com";
    //std::string url = "https://vip.icbc.com.cn/icbc/perbank/index.jsp";
    std::string useragent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0.1";
    /*
    CURL_GLOBAL_ALL                //初始化所有的可能的调用。
    CURL_GLOBAL_SSL               //初始化支持 安全套接字层。
    CURL_GLOBAL_WIN32            //初始化win32套接字库。
    CURL_GLOBAL_NOTHING         //没有额外的初始化。
    */
    curl_global_init(CURL_GLOBAL_ALL);
    curl = curl_easy_init();
    if(curl) {
        // 远程URL,支持 http, https, ftp
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_USERAGENT, useragent.c_str());
        // 官方下载的DLL并不支持GZIP,Accept-Encoding:deflate, gzip
        curl_easy_setopt(curl, CURLOPT_ENCODING, "gzip, deflate");          
        //curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);//调试信息打开
        //https 访问专用:start
#ifdef SKIP_PEER_VERIFICATION
        //跳过服务器SSL验证,不使用CA证书
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
        //如果不跳过SSL验证,则可指定一个CA证书目录
        //curl_easy_setopt(curl, CURLOPT_CAPATH, "this is ca ceat");
#endif

#ifdef SKIP_HOSTNAME_VERFICATION
        //验证服务器端发送的证书,默认是 2(高),1(中),0(禁用)
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
#endif
        //https 访问专用:end


        //发送cookie值给服务器
        //curl_easy_setopt(curl, CURLOPT_COOKIE, "name1=var1; name2=var2;"); 
        /* 与服务器通信交互cookie,默认在内存中,可以是不存在磁盘中的文件或留空 */
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "./cookie.txt"); 
        /* 与多个CURL或浏览器交互cookie,会在释放内存后写入磁盘文件 */
        curl_easy_setopt(curl, CURLOPT_COOKIEJAR, "./cookie.txt"); 

        /* POST 数据 */
        // curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
        //设置重定向的最大次数
        curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);
        //设置301、302跳转跟随location
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1);
        //抓取内容后,回调函数
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, call_wirte_func);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &szbuffer);
        //抓取头信息,回调函数
        curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback );
        curl_easy_setopt(curl, CURLOPT_HEADERDATA, &szheader_buffer);

        /* 
        CURLE_OK	任务完成一切都好
        CURLE_UNSUPPORTED_PROTOCOL	不支持的协议,由URL的头部指定
        CURLE_COULDNT_CONNECT	不能连接到remote 主机或者代理
        CURLE_REMOTE_ACCESS_DENIED	访问被拒绝
        CURLE_HTTP_RETURNED_ERROR	Http返回错误
        CURLE_READ_ERROR	读本地文件错误 
        CURLE_SSL_CACERT	访问HTTPS时需要CA证书路径
        */
        code = curl_easy_perform(curl);
        if(CURLE_OK == code) {
            double val;

            /* check for bytes downloaded */
            code = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &val);
            if((CURLE_OK == code) && (val>0))
                printf("Data downloaded: %0.0f bytes.\n", val);

            /* check for total download time */
            code = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &val);
            if((CURLE_OK == code) && (val>0))
                printf("Total download time: %0.3f sec.\n", val);

            /* check for average download speed */
            code = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &val);
            if((CURLE_OK == code) && (val>0))
                printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024);

            printf("%s\n",szbuffer.c_str()); 
        } 
        else {
            fprintf(stderr, "Failed to get '%s' [%s]\n", url, errorBuffer);
            // exit(EXIT_FAILURE);
        }

        /* 释放内存 */
        curl_easy_cleanup(curl);
    }
    curl_global_cleanup();

    getchar();
    return 0;
}
 

 

提示:

若没有找到zlib1.dll文件。

http://gnuwin32.sourceforge.net/downlinks/zlib-bin-zip.php 下载zib包,将dll文件拷贝至debug目录,程序即可正常执行了。

 

分享到:
评论

相关推荐

    vc++使用libcurl下载文件,支持断点续传,支持多文件下载

    本篇文章将深入探讨如何在VC++环境中利用libcurl库实现文件的下载功能,包括断点续传和多文件下载。 首先,libcurl库需要正确地安装和配置到Visual Studio项目中。这通常涉及到设置库路径、包含目录以及链接器依赖...

    vc6.0 libCurl 简单使用

    **VC6.0 libCurl 简单使用** libCurl 是一个广泛使用的开源库,主要用于处理URL传输,支持多种网络协议,如HTTP、HTTPS、FTP、FTPS等。在Windows环境中,尤其是在Visual C++ 6.0(简称VC6.0)这样的老版本开发工具...

    java通过jni调用libcurl,curl java

    libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。 PHP自带curl扩展,但java没有curl扩展,这个工程的目的,就是将...

    vc6 libCurl 简单使用例子

    本篇文章将详细讲解如何在VC6中使用libCurl库,以及如何结合提供的简单使用例子进行项目集成。 首先,你需要下载libCurl的源码或预编译库。在这个压缩包中,你可能已经得到了一个预先编译好的静态库文件。静态库的...

    libcurl_vc14.rar

    **libcurl_vc14** 是一个专为Visual Studio 2015 (vc14) 构建的libcurl库,它允许开发者在Windows平台上利用C++进行HTTP、FTP、FTPS等多种网络协议的交互。libcurl是一个开源的库,提供了在各种编程语言中方便地处理...

    libcurl_vc15.rar

    **libcurl_vc15** 是一个专门为Visual Studio 2017(vc15)编译的libcurl库,适用于Windows平台。libcurl是一个著名的开源库,它允许开发者通过多种网络协议,包括HTTP、FTP、FTPS等,进行数据传输。这个库提供了...

    libcurl-vc15-x64-release-static-ipv6-sspi-schannel.rar

    标题 "libcurl-vc15-x64-release-static-ipv6-sspi-schannel.rar" 暗示了这是一个针对Windows平台的libcurl库的特定版本。libcurl是一个开源的库,用于处理各种网络协议,如HTTP、FTP、SMTP等。这里的"vc15"指的是...

    libcurl vc6 static library

    总之,libcurl是一个强大的网络通信库,其静态库版本特别适合在vc6环境中使用。通过熟练掌握libcurl的使用,开发者可以轻松地实现各种复杂的网络通信任务,如文件上传下载、网页抓取、邮件发送等。在vc6项目中正确...

    支持https的libcurl静态库(openssl)

    在描述中提到了该库文件是使用Visual Studio 2010(VS2010)编译的,这意味着这个libcurl版本是为Windows平台设计的,并且兼容VC10编译器。"vc10"代表Visual C++ 2010,"x86"表示这是针对32位系统的版本,"release...

    Windows下VS2015编译并使用libcurl.lib静态库1

    在Windows环境下,Visual Studio 2015(VS2015)是一个广泛使用的C++开发工具,而libcurl是一个强大的URL传输库,支持多种网络协议。本教程将详细介绍如何在VS2015中编译并使用libcurl.lib静态库。 首先,你需要...

    libcurl库编译后结果,可直接使用

    《深入理解libcurl库在VS2013下的编译与应用》 libcurl库,一个广泛应用于网络数据传输的开源库,为开发者提供了在C和...对于新手和有经验的开发者而言,这都是一个宝贵的资源,能帮助他们更好地理解和使用libcurl库。

    libcurl 使用vs2010编译的动态库和静态库(包含的debug和release版和头文件)

    《libcurl在VS2010环境下的编译与应用详解》 libcurl是一个强大的开源库,用于处理各种网络协议,如HTTP、FTP、SMTP等,广泛应用于客户端网络通信。本资源提供了使用Visual Studio 2010编译的libcurl动态库(dll)...

    qt下libcurl的封装和使用(包含库封装、库调用、http服务器)

    在本文中,我们将深入探讨如何在Qt环境下封装和使用libcurl库,以及如何构建一个简单的HTTP服务器。libcurl是一个强大的库,它允许开发者在各种编程语言中实现多种网络协议,包括HTTP、HTTPS、FTP等。在Qt环境中使用...

    libcurl 动态库

    《libcurl动态库详解及其应用》 libcurl是一款强大的开源库,主要用于在各种协议下进行文件传输,尤其在HTTP和HTTPS方面表现出色。这个库以其跨平台性、易用性和全面的功能,深受开发者喜爱。标题提到的“libcurl...

    libcurl-vc15-x86-release-dll-ssl-static.zip

    使用这个库,C++开发者可以轻松实现以下功能: - 发送HTTP和HTTPS请求 - 下载和上传文件 - 处理POST请求和表单提交 - 实现HTTP认证和cookie管理 - 支持多种传输协议 - 进行多线程和并发请求 - 错误处理和调试信息...

    libcurl库,直接下载使用

    **libcurl库详解** libcurl是一个强大的开源库,主要用于处理URL相关的各种网络传输任务,包括HTTP、HTTPS、FTP、FTPS等多种协议。它为开发者提供了一组API,使得在多种编程语言中进行网络请求变得非常方便。...

    libcurl库的安装和使用111

    使用 libcurl 库需要调用 curl_global_init() 函数来初始化库,然后调用 curl_easy_init() 函数来获取 easy interface 型指针。接着,可以使用 curl_easy_setopt() 函数来设置传输选项,然后调用 curl_easy_perform...

    iOS端libcurl静态库

    在iOS端使用libcurl,首先需要获取适用于iOS的静态库版本。静态库的优点是将所有依赖项包含在内,避免了运行时找不到动态库的问题,尤其适合那些不希望或不能在用户设备上安装额外框架的应用。本压缩包提供的libcurl...

    libcurl静态库

    **libcurl静态库详解** libcurl是一个开源的C库,它提供了一组API,用于在各种协议下进行文件传输,包括HTTP、HTTPS、FTP、FTPS等。这个库被广泛应用于许多应用程序中,用于实现网络数据交换功能。本文将深入探讨...

    libcurl 8.0.1 VC13 SDK.zip

    1. **安装**:解压"libcurl 8.0.1 VC13 SDK.zip",将包含的头文件(通常是`include`目录)、库文件(通常是`lib`目录)和DLL文件(通常是`bin`目录)添加到你的项目路径中。 2. **配置项目**:在Visual Studio 2013...

Global site tag (gtag.js) - Google Analytics