1. 程式人生 > >VS2015靜態編譯libcurl(C++ curl封裝類)

VS2015靜態編譯libcurl(C++ curl封裝類)

一、最新libcurl靜態編譯教程(curl-7.51版/curl-7.52版)

1、安裝perl,在官網下載,安裝好以後,測試perl -v是否成功

2、編譯openssl(已編譯好的下載地址

perl Configure VC-WIN32 --prefix=D:\openssl

ms\do_ms.bat

nmake -f ms\nt.mak(靜態編譯)

nmake -f ms\nt.mak install

3、下載libcurl(已編譯好的7.51版下載地址 7.52版下載地址

在原始碼的projects中可以找到vc14這個專案檔案,開啟即可。

然後檢視專案的openssl的inc32目錄的路徑在哪裡,可以看到../../../../../openssl/inc32,所以openssl和libcurl是出於同級目錄的。

接著新增openssl中的lib目錄下的libeasy32和ssleay32這2個靜態庫到依賴項中。

設定下你要編譯的專案的MTD還是MT,然後就可以編譯了。

當然也可以下載我編譯好的,在上面的地址中。

4、這裡有一份高手進一步封裝的類,非常好用(下載地址

支援同步和非同步請求。

二、簡單使用教程

1、新增包含目錄:libcurl中的include

2、新增庫目錄:libcurl中的lib目錄

3、新增預編譯巨集:USE_OPENSSL,CURL_STATICLIB

4、新增庫檔案:

crypt32.lib
ws2_32.lib
wldap32.lib


libcurld.lib

5、訪問12306網站,輕鬆繞過https加密的例子:

  1. #include "stdafx.h"    
  2. #include <stdio.h>  
  3. #include <windows.h>    
  4. #include <iostream>  
  5. #include <string>  
  6. #include <curl/curl.h>  
  7. using namespace std;  
  8. size_t Reply(void * ptr, size_t size, size_t nmemb, void * stream)  
  9. {  
  10.     string* str = (string*)stream;  
  11.     (*str).append((char*)ptr, size*nmemb);  
  12.     return size*nmemb;  
  13. }  
  14. wstring str_cvt(const string& from_str, int cvt_type) {  
  15.     int wstr_len = MultiByteToWideChar(cvt_type, 0, from_str.c_str(), -1, nullptr, 0);  
  16.     wchar_t *wstr = new wchar_t[wstr_len + 1];  
  17.     memset(wstr, 0, (wstr_len + 1)*sizeof(wchar_t));  
  18.     MultiByteToWideChar(cvt_type, 0, from_str.c_str(), -1, wstr, wstr_len);  
  19.     wstring ret_str(wstr); delete[] wstr;  
  20.     return ret_str;  
  21. }  
  22. string str_cvt(const wstring& from_str, int cvt_type) {  
  23.     int str_len = WideCharToMultiByte(cvt_type, 0, from_str.c_str(), -1, nullptr, 0, nullptr, nullptr);  
  24.     char *str = new char[str_len + 1];  
  25.     memset(str, 0, str_len + 1);  
  26.     WideCharToMultiByte(cvt_type, 0, from_str.c_str(), -1, str, str_len, nullptr, nullptr);  
  27.     string ret_str(str); delete[] str;  
  28.     return ret_str;  
  29. }  
  30. int main()  
  31. {   
  32.     string data; // 返回的內容  
  33.     CURL *curl;  
  34.     CURLcode res;  
  35.     curl_global_init(CURL_GLOBAL_ALL);  
  36.     curl = curl_easy_init();  
  37.     if (curl) {  
  38.         curl_easy_setopt(curl, CURLOPT_URL, "https://kyfw.12306.cn/otn/login/init");  
  39.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  40.         curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  
  41.         curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Reply);  
  42.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);  
  43.         res = curl_easy_perform(curl);  
  44.         if (res != CURLE_OK)  
  45.             fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));  
  46.         curl_easy_cleanup(curl);  
  47.     }  
  48.     curl_global_cleanup();  
  49.     cout << str_cvt(str_cvt(data,CP_UTF8),CP_ACP) << endl;  
  50.     getchar();  
  51.     return 0;  
  52. }  

四、引數詳解:

1、全域性環境初始化

 print?
  1. curl_global_init(CURL_GLOBAL_ALL);  
  2. curl_global_cleanup();  


CURL_GLOBAL_ALL 初始化所有可能的值,一般用這個巨集

CURL_GLOBAL_WIN32 初始化winsock庫

CURL_GLOBAL_SSL 初始化與ssl相關的環境

2、初始化curl

 print?
  1. CURL *curl = curl_easy_init();  
  2. curl_easy_cleanup(curl);  


初始化,獲取一個curl物件,無參函式

3、非常重要的函式,設定curl的配置資訊

 print?
  1. CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...)  

a、設定url:

防止301、302跳轉:

 print?
  1. curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,0);  

請求的地址:

 print?
  1. curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");  

b、設定post:

 print?
  1. curl_easy_setopt(curl, CURLOPT_POST, 1);  
  2. curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=xxx");  

c、設定coockie

 print?
  1. curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "D:/coockie.txt");  

d、設定資料接受

 print?
  1. curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, ShowHtml);  
  2. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &retStr);  

e、設定進度條

 print?
  1. curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);  
  2. curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);  
  3. curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, progress);  

f、設定ssl忽略驗證

 print?
  1. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);  
  2. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);  

g、設定頭資訊接受

返回的正文是否有頭資訊:        curl_easy_setopt(curl, CURLOPT_HEADER, 1);表示有

 print?
  1. curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, ShowHtml);  
  2. curl_easy_setopt(curl, CURLOPT_HEADERDATA, &retStr);  

h、設定上傳

 print?
  1. curl_easy_setopt(curl, CURLOPT_READFUNCTION, ShowHtml);  
  2. curl_easy_setopt(curl, CURLOPT_READDATA, &retStr);  


i、設定傳輸時間

 print?
  1. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);  
  2. curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30);  

j、設定請求頭資訊

預設頭資訊:

Host:http1.1(大部分http1.0)版本都要求客戶端請求提供這個資訊頭。
Pragma:"no-cache"。表示不要緩衝資料。
Accept:"*/*"。表示允許接收任何型別的資料。
Expect: 以POST的方式向HTTP伺服器提交請求時,libcurl會設定該訊息頭為"100-continue",它要求伺服器在正式處理該請求之前,返回一 個"OK"訊息。如果POST的資料很小,libcurl可能不會設定該訊息頭

 print?
  1. 相關推薦

    VS2015靜態編譯libcurlC++ curl封裝

    一、最新libcurl靜態編譯教程(curl-7.51版/curl-7.52版) 1、安裝perl,在官網下載,安裝好以後,測試perl -v是否成功 2、編譯openssl(已編譯好的下載

    HDFS的Java API Java API封裝

    修改 com eight oot font pat con for inpu HDFS的Java API Java API封裝類 package com.hadoop.utils; import org.apache.commons.lang.StringUtils;

    Windows 編譯libcurlopenssl+zlib使用VC編譯

    org tar 處理器 verify easy 控制臺應用程序 默認安裝 1.0 tps libcurl主要功能就是用不同的協議連接和溝通不同的服務器,如果使用HTTPS,需要OpenSSL libcurl https://curl.haxx.se/downl

    靜態成員C++學習筆記 27

    靜態成員:為了實現一個類的多個物件之間的資料共享。 靜態成員包括 靜態資料成員 和 靜態函式成員。 一、靜態資料成員 在一個類中若將一個數據成員說明為static,這種成員稱為靜態資料成員。 與一般的資料成員不同,無論建立多少個類的物件,都只有一個靜態資料

    資料結構複習筆記——靜態順序表C語言

    定義結構體 typedef struct{ int data[MAXSIZE]; //MAXSIZE為最大容量 int length; //當前長度 } Array; 建立順序表 /* 需要接受一個已知的陣列,以及該陣列的長度 按順序將陣列內的值,賦給順

    靜態連結串列插入和刪除操作詳解C語言程式碼實現

    本節主要講解靜態連結串列的插入和刪除操作,有關靜態連結串列的詳細講解請閱讀《靜態連結串列及C語言實現》一文。 在講解靜態連結串列的插入和刪除操作之前,我們假設有如下的靜態連結串列: 圖中,array[0] 用作備用連結串列的頭結點,array[1] 用作存放資料的連結串列的頭結點,array[0]

    程式不包含適合於入口點的靜態“Main”方法C#

    問題: 昨天重敲三層的時候出現了這樣一個問題,如下圖:程式不包含適合於入口點的靜態“Main”方法 解決方案: 經過查閱,解決方案如下:選擇該專案的屬性–應用程式–輸出型別–類庫。 出現這種問題的原因: 出現這樣的問題是因為我的程式裡面沒有 static

    vs2015靜態編譯Qt5.7.1及使用

    2.下載並安裝Python; 3.下載並安裝Perl; 注意:① 安裝Python,Perl 時要注意勾選新增環境變數到系統。            ② 檢測三個環境是否安裝好,開啟cmd視窗

    RabbitMQ C++客戶端SimpleAmqpClient編譯總結32以及64位

    整個過程沒有截圖,使用為我的“印象筆記”不能傳圖,所以全是以文字形式描述,各位跟蹤我的腳步,一般能走到末尾。 遇到的問題: 1、Cmake必須是2.8版本或以上 2、boost編譯方式必須是預設動態編譯庫,使用靜態庫編譯會報錯(最終我重新編譯boost庫使用完全且預設動

    關於使用VS2015靜態編譯

    首先必須搞清楚專案->專案屬性->配置屬性->C/C++->程式碼生成->執行庫中四個選項的關係: 多執行緒除錯Dll (/MDd) 對應——-MD_DynamicDebug 多執行緒Dll (/MD) 對應————-MD_Dy

    mac下使用vim gcc/g++ 編譯cppc++檔案並執行

    首先確認gcc和g++版本,二者是否一致 命令:gcc -v;g++ -v 然後vim 編寫c++檔案,比如:#include <iostream>..... 最後儲存的時候要注意,exit+:sav+cppname.cpp “.cpp”字尾保證編譯器識別是c+

    3.線性表的鏈式儲存結構————靜態連結串列C語言和C++完整解析

    目錄 1.靜態連結串列的概念 因為有些語言沒有指標,所以難以實現普通連結串列,靜態連結串列就是用來解決這一問題的有力工具,靜態連結串列使用陣列來實現連結串列。靜態連結串列用遊標來代替普通連結串列的指標域,並且用下標代替普通連結串列的結點

    封裝之MYSQLHelperC#連線MySql資料庫

    using System; using System.Collections; using System.Configuration; using MySql.Data; using MySql.Data.MySqlClient; using System.Da

    Hello World!的編譯過程C語言

    幾乎所有學C語言程式設計的同學第一個接觸的程式都是Hello World!。但是它是怎麼由c檔案轉換為可執行檔案的呢? 原始檔(helloworld.c)如下: #include <stdio.h> int main() { pri

    網絡編程中的常見陷阱之 0x十六進制數C++字面值常量

    十六進制 aid word 網絡編程 情況 技術分享 fill 截斷 常見 十六進制數相等的推斷 請問例如以下程序的輸出是神馬? #include <iostream> #include <string> using namespace std

    數據結構之靜態隊列循環隊列

    div int turn ont malloc r+ nbsp ron traverse # include <stdio.h> # include <malloc.h> typedef struct Queue { int * pBas

    RabbitMQ基礎學習筆記C#代碼示例

    esp 輸出 出隊 csharp 實例代碼 為什麽 mode 規則 無需 一、定義: MQ是MessageQueue,消息隊列的簡稱(是流行的開源消息隊列系統,利用erlang語言開發)。MQ是一種應用程序對應用程序的通信方法。應用程序通過讀寫入隊和出隊的消息來通信

    struts2封裝客戶端請求數據3種封裝方式

    空指針異常 必須 nis png pri pan this drive .cn 長話短說,直接進入主題. 1.屬性驅動 action的屬性名稱必須和jsp輸入項的name屬性保持一致; 必須要在action類中提供該屬性的set方法,但有時候會出錯,為了保險起見,我們把g

    漢諾塔的故事C語言——遞歸

    code log 圓盤 印度 return 16px move class baidu 漢諾塔:   漢諾塔(又稱河內塔)問題是源於印度一個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片黃金圓盤。大梵天命令婆羅門把圓盤

    更新整理本人所有博文中提供的代碼與工具C++,2014.01

    jbd mlu osg mef sgd dac gpa irf rtc 說酉讕vuu2c短殉炕<a target="_blank" href="http://weibo.com/u/6212262647">http://weibo.com/u/621226264