• VS2010编译支持openssl的Libcurl


    一、简介

      libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。

    二、操作步骤

    相关下载:

    Libcurl下载地址链接(我用的是7_71_1版本):
      https://github.com/curl/curl/releases/tag/curl-7_71_1

    openssl安装包下载地址(我选择了Win64OpenSSL-3_0_5.msi这个版本):
      http://slproweb.com/products/Win32OpenSSL.html

    编译操作:

      1.解压完libcurl后进入到 curl-7.71.1\projects\Windows\VC10\lib 下,用vs2010打开libcurl.sln

      2.选择DLL Release 和 X64

    在这里插入图片描述
      3.拷贝OpenSSL的头文件和库文件

        3.1.先将OpenSSL-Win64\include\ 下的openssl拷贝到curl-7.71.1的同级目录,如下:

    在这里插入图片描述

        3.2.OpenSSL-Win64\lib 下,找到libcrypto.lib 和 libssl.lib ,拷贝到curl-7.71.1\projects\Windows\VC10\lib下。(注意:网上说的Openssl的libeay32.dll和ssleay32.dll,其实是在在1.0.x之前的版本中,在之后的版本中使用的是libssl.dll和libcrypto.dll)
    在这里插入图片描述
      4.项目属性设置

        4.1.设置附加包含目录
    在这里插入图片描述

        4.2.设置附加包含目录
    在这里插入图片描述

      5.编译生成libcurl.lib 和 libcurl.dll
    生成的文件在curl-7.71.1\build\Win64\VC10\DLL Release文件夹下:
    在这里插入图片描述

    三、代码中使用https访问

    int CurlSdk::HttpsGet(const string& strUrl, string& strResponse, const char * pCaPath)
    {
        CURLcode res;
        CURL* pCurl = curl_easy_init();
        if(nullptr == pCurl)
        {
            return CURLE_FAILED_INIT;
        }
    
        if(m_bDebug)
        {
            curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1);
            curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, OnDebug);
        }
    
        //https
        if(NULL == pCaPath)
        {
            curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, false);//设定为不验证证书和HOST
            curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYHOST, false);
        }
        else
        {
            curl_easy_setopt(pCurl, CURLOPT_SSL_VERIFYPEER, true);
            curl_easy_setopt(pCurl, CURLOPT_CAINFO, pCaPath);
        }
        
    
        curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
        curl_easy_setopt(pCurl, CURLOPT_READFUNCTION, NULL);
        curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, onWriteFunc);//设置回调函数
        curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, static_cast(&strResponse));
        curl_easy_setopt(pCurl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);//开启digest认证
    
        //当多个线程都使用超时处理的时候,同时主线程中有sleep或是wait等操作。
        //如果不设置这个选项,libcurl将会发信号打断这个wait从而导致程序退出。
        curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1);
    
        curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 3);
        curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 6);
    
        res = curl_easy_perform(pCurl);
        curl_easy_cleanup(pCurl);
    
        return res;
    }
    
    int CurlSdk::HttpPost(const string& strUrl, const string& strPost, const string &sHeader, string& strResponse)
    {
        QMutexLocker guard(&m_lock);
    
        CURLcode res;
        CURL* pCurl = curl_easy_init();
        if(nullptr == pCurl)
        {
            return CURLE_FAILED_INIT;
        }
    
        if(m_bDebug)
        {
            curl_easy_setopt(pCurl, CURLOPT_VERBOSE, 1);
            curl_easy_setopt(pCurl, CURLOPT_DEBUGFUNCTION, OnDebug);
        }
    
        curl_easy_setopt(pCurl, CURLOPT_URL, strUrl.c_str());
        curl_easy_setopt(pCurl, CURLOPT_POST, 1);
        curl_easy_setopt(pCurl, CURLOPT_POSTFIELDS, strPost.c_str());
        curl_easy_setopt(pCurl, CURLOPT_READFUNCTION, NULL);
        curl_easy_setopt(pCurl, CURLOPT_WRITEFUNCTION, onWriteFunc);
        curl_easy_setopt(pCurl, CURLOPT_WRITEDATA, static_cast(&strResponse));
        curl_easy_setopt(pCurl, CURLOPT_NOSIGNAL, 1);
        curl_easy_setopt(pCurl, CURLOPT_CONNECTTIMEOUT, 8);
        curl_easy_setopt(pCurl, CURLOPT_TIMEOUT, 8);
    
        struct curl_slist *pSlist = nullptr;
        pSlist = curl_slist_append(pSlist, sHeader.c_str());
        curl_easy_setopt(pCurl, CURLOPT_HTTPHEADER, pSlist);
    
        res = curl_easy_perform(pCurl);
        curl_easy_cleanup(pCurl);
    
        return res;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
  • 相关阅读:
    SpringBoot整合分布式任务调度平台xxl-job
    docker安装nginx1.20.2并配置nginx.conf
    SpringBoot 统一功能处理
    安卓毕业设计app项目基于Uniapp+SSM实现的安卓的掌上校园系统食堂缴费图书馆预约
    linux的应用线程同步与驱动同步机制
    基于JAVA疫情防控期间人员档案追演示录像上计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    人工智能知识全面讲解:非线性支持向量机与核函数
    回归损失和分类损失
    进程信号的保存和处理
    多模态及图像安全的探索与思考
  • 原文地址:https://blog.csdn.net/linyibin_123/article/details/127574012