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加密的例子:
- #include "stdafx.h"
- #include <stdio.h>
- #include <windows.h>
- #include <iostream>
- #include <string>
- #include <curl/curl.h>
- using namespace std;
-
size_t Reply(void * ptr, size_t size, size_t nmemb, void * stream)
- {
- string* str = (string*)stream;
- (*str).append((char*)ptr, size*nmemb);
- return size*nmemb;
- }
- wstring str_cvt(const string& from_str, int cvt_type) {
- int wstr_len = MultiByteToWideChar(cvt_type, 0, from_str.c_str(), -1, nullptr, 0);
- wchar_t *wstr = new wchar_t[wstr_len + 1];
- memset(wstr, 0, (wstr_len + 1)*sizeof(wchar_t));
- MultiByteToWideChar(cvt_type, 0, from_str.c_str(), -1, wstr, wstr_len);
- wstring ret_str(wstr); delete[] wstr;
- return ret_str;
- }
- string str_cvt(const wstring& from_str, int cvt_type) {
- int str_len = WideCharToMultiByte(cvt_type, 0, from_str.c_str(), -1, nullptr, 0, nullptr, nullptr);
- char *str = new char[str_len + 1];
- memset(str, 0, str_len + 1);
- WideCharToMultiByte(cvt_type, 0, from_str.c_str(), -1, str, str_len, nullptr, nullptr);
- string ret_str(str); delete[] str;
- return ret_str;
- }
- int main()
- {
- string data; // 返回的內容
- CURL *curl;
- CURLcode res;
- curl_global_init(CURL_GLOBAL_ALL);
- curl = curl_easy_init();
- if (curl) {
- curl_easy_setopt(curl, CURLOPT_URL, "https://kyfw.12306.cn/otn/login/init");
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, Reply);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
- res = curl_easy_perform(curl);
- if (res != CURLE_OK)
- fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
- curl_easy_cleanup(curl);
- }
- curl_global_cleanup();
- cout << str_cvt(str_cvt(data,CP_UTF8),CP_ACP) << endl;
- getchar();
- return 0;
- }
四、引數詳解:
1、全域性環境初始化
print?- curl_global_init(CURL_GLOBAL_ALL);
- curl_global_cleanup();
CURL_GLOBAL_ALL 初始化所有可能的值,一般用這個巨集
CURL_GLOBAL_WIN32 初始化winsock庫
CURL_GLOBAL_SSL 初始化與ssl相關的環境
2、初始化curl
print?- CURL *curl = curl_easy_init();
- curl_easy_cleanup(curl);
初始化,獲取一個curl物件,無參函式
3、非常重要的函式,設定curl的配置資訊
print?- CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...)
a、設定url:
防止301、302跳轉:
print?- curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,0);
請求的地址:
print?- curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
b、設定post:
print?- curl_easy_setopt(curl, CURLOPT_POST, 1);
- curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=xxx");
c、設定coockie
print?- curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "D:/coockie.txt");
d、設定資料接受
print?- curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION, ShowHtml);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, &retStr);
e、設定進度條
print?- curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
- curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
- curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, progress);
f、設定ssl忽略驗證
print?- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
g、設定頭資訊接受
返回的正文是否有頭資訊: curl_easy_setopt(curl, CURLOPT_HEADER, 1);表示有
print?- curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, ShowHtml);
- curl_easy_setopt(curl, CURLOPT_HEADERDATA, &retStr);
h、設定上傳
print?- curl_easy_setopt(curl, CURLOPT_READFUNCTION, ShowHtml);
- curl_easy_setopt(curl, CURLOPT_READDATA, &retStr);
i、設定傳輸時間
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 30);
- curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 30);
j、設定請求頭資訊
預設頭資訊:
print?Host:http1.1(大部分http1.0)版本都要求客戶端請求提供這個資訊頭。
Pragma:"no-cache"。表示不要緩衝資料。
Accept:"*/*"。表示允許接收任何型別的資料。
Expect: 以POST的方式向HTTP伺服器提交請求時,libcurl會設定該訊息頭為"100-continue",它要求伺服器在正式處理該請求之前,返回一 個"OK"訊息。如果POST的資料很小,libcurl可能不會設定該訊息頭
-
相關推薦
VS2015靜態編譯libcurl(C++ 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 編譯libcurl(openssl+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++ 編譯cpp(c++)檔案並執行
首先確認gcc和g++版本,二者是否一致 命令:gcc -v;g++ -v 然後vim 編寫c++檔案,比如:#include <iostream>..... 最後儲存的時候要注意,exit+:sav+cppname.cpp “.cpp”字尾保證編譯器識別是c+
3.線性表的鏈式儲存結構————靜態連結串列(C語言和C++完整解析)
目錄 1.靜態連結串列的概念 因為有些語言沒有指標,所以難以實現普通連結串列,靜態連結串列就是用來解決這一問題的有力工具,靜態連結串列使用陣列來實現連結串列。靜態連結串列用遊標來代替普通連結串列的指標域,並且用下標代替普通連結串列的結點
封裝類之MYSQLHelper(C#連線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