一、最新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
libcurl.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、全局环境初始化

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

CURL_GLOBAL_ALL 初始化所有可能的值,一般用这个宏

CURL_GLOBAL_WIN32 初始化winsock库

CURL_GLOBAL_SSL 初始化与ssl相关的环境

2、初始化curl

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

初始化,获取一个curl对象,无参函数

3、非常重要的函数,设置curl的配置信息

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

a、设置url:

防止301、302跳转:

  1. curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION,0);

请求的地址:

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

b、设置post:

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

c、设置coockie

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

d、设置数据接受

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

e、设置进度条

  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忽略验证

  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);表示有

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

h、设置上传

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

i、设置传输时间

  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可能不会设置该消息头

  1. struct curl_slist *headers = NULL;
  2. headers = curl_slist_append(headers, "Hey-server-hey: how are you?");
  3. headers = curl_slist_append(headers, "X-silly-content: yes");
  4. curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);
  5. curl_slist_free_all(headers);

4、获取应答头信息

  1. CURLINFO info;
  2. curl_easy_getinfo(curl, info);

可以获取info中的

  1. CURLINFO_RESPONSE_CODE
  2. CURLINFO_HEADER_SIZE
  3. CURLINFO_COOKIELIST

5、执行查询操作

  1. res = curl_easy_perform(curl);
  2. if (res != CURLE_OK)
  3. fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));

返回值类型有:

  1. CURLE_OK  // 任务完成一切都好
  2. CURLE_UNSUPPORTED_PROTOCOL  // 不支持的协议,由URL的头部指定
  3. CURLE_COULDNT_CONNECT  // 不能连接到remote 主机或者代理
  4. CURLE_REMOTE_ACCESS_DENIED  // 访问被拒绝
  5. CURLE_HTTP_RETURNED_ERROR  // Http返回错误
  6. CURLE_READ_ERROR  // 读取本地文件错误

6、断点续传问题

  1. curl_easy_setopt(curl, CURLOPT_RANGE, 0 - 499, 1000 - 1499);
  2. curl_easy_setopt(curl, CURLOPT_RESUME_FROM, 1500);

curl_easy_setopt参数大全:

  1. CURLOPT_HEADER:设为1,则在返回的内容里包含http header;
  2. CURLOPT_FOLLOWLOCATION:设为0,则不会自动301,302跳转;
  3. *CURLOPT_INFILESIZE: 当你上传一个文件到远程站点,这个选项告诉PHP你上传文件的大小。
  4. *CURLOPT_VERBOSE: 如果你想CURL报告每一件意外的事情,设置这个选项为一个非零值。
  5. *CURLOPT_HEADER: 如果你想把一个头包含在输出中,设置这个选项为一个非零值。
  6. *CURLOPT_NOPROGRESS: 如果你不会PHP为CURL传输显示一个进程条,设置这个选项为一个非零值。
  7. 注意:PHP自动设置这个选项为非零值,你应该仅仅为了调试的目的来改变这个选项。
  8. *CURLOPT_NOBODY: 如果你不想在输出中包含body部分,设置这个选项为一个非零值。
  9. *CURLOPT_FAILONERROR: 如果你想让PHP在发生错误(HTTP代码返回大于等于300)时,不显示,设置这个选项为一人非零值。默认行为是返回一个正常页,忽略代码。
  10. *CURLOPT_UPLOAD: 如果你想让PHP为上传做准备,设置这个选项为一个非零值。
  11. *CURLOPT_POST: 如果你想PHP去做一个正规的HTTP POST,设置这个选项为一个非零值。这个POST是普通的 application/x-www-from-urlencoded 类型,多数被HTML表单使用。
  12. *CURLOPT_FTPLISTONLY: 设置这个选项为非零值,PHP将列出FTP的目录名列表。
  13. *CURLOPT_FTPAPPEND: 设置这个选项为一个非零值,PHP将应用远程文件代替覆盖它。
  14. *CURLOPT_NETRC: 设置这个选项为一个非零值,PHP将在你的 ~./netrc 文件中查找你要建立连接的远程站点的用户名及密码。
  15. *CURLOPT_FOLLOWLOCATION: 设置这个选项为一个非零值(象 “Location: “)的头,服务器会把它当做HTTP头的一部分发送(注意这是递归的,PHP将发送形如 “Location: “的头)。
  16. *CURLOPT_PUT: 设置这个选项为一个非零值去用HTTP上传一个文件。要上传这个文件必须设置CURLOPT_INFILE和CURLOPT_INFILESIZE选项.
  17. *CURLOPT_MUTE: 设置这个选项为一个非零值,PHP对于CURL函数将完全沉默。
  18. *CURLOPT_TIMEOUT: 设置一个长整形数,作为最大延续多少秒。
  19. *CURLOPT_LOW_SPEED_LIMIT: 设置一个长整形数,控制传送多少字节。
  20. *CURLOPT_LOW_SPEED_TIME: 设置一个长整形数,控制多少秒传送CURLOPT_LOW_SPEED_LIMIT规定的字节数。
  21. *CURLOPT_RESUME_FROM: 传递一个包含字节偏移地址的长整形参数,(你想转移到的开始表单)。
  22. *CURLOPT_SSLVERSION: 传递一个包含SSL版本的长参数。默认PHP将被它自己努力的确定,在更多的安全中你必须手工设置。
  23. *CURLOPT_TIMECONDITION: 传递一个长参数,指定怎么处理CURLOPT_TIMEVALUE参数。你可以设置这个参数为TIMECOND_IFMODSINCE 或 TIMECOND_ISUNMODSINCE。这仅用于HTTP。
  24. *CURLOPT_TIMEVALUE: 传递一个从1970-1-1开始到现在的秒数。这个时间将被CURLOPT_TIMEVALUE选项作为指定值使用,或被默认TIMECOND_IFMODSINCE使用。
  25. 下列选项的值将被作为字符串:
  26. *CURLOPT_URL: 这是你想用PHP取回的URL地址。你也可以在用curl_init()函数初始化时设置这个选项。
  27. *CURLOPT_USERPWD: 传递一个形如[username]:[password]风格的字符串,作用PHP去连接。
  28. *CURLOPT_PROXYUSERPWD: 传递一个形如[username]:[password] 格式的字符串去连接HTTP代理。
  29. *CURLOPT_RANGE: 传递一个你想指定的范围。它应该是”X-Y”格式,X或Y是被除外的。HTTP传送同样支持几个间隔,用逗句来分隔(X-Y,N-M)。
  30. *CURLOPT_POSTFIELDS: 传递一个作为HTTP “POST”操作的所有数据的字符串。
  31. *CURLOPT_REFERER: 在HTTP请求中包含一个”referer”头的字符串。
  32. *CURLOPT_USERAGENT: 在HTTP请求中包含一个”user-agent”头的字符串。
  33. *CURLOPT_FTPPORT: 传递一个包含被ftp “POST”指令使用的IP地址。这个POST指令告诉远程服务器去连接我们指定的IP地址。这个字符串可以是一个IP地址,一个主机名,一个网络界面名(在UNIX下),或是‘-’(使用系统默认IP地址)。
  34. *CURLOPT_COOKIE: 传递一个包含HTTP cookie的头连接。
  35. *CURLOPT_SSLCERT: 传递一个包含PEM格式证书的字符串。
  36. *CURLOPT_SSLCERTPASSWD: 传递一个包含使用CURLOPT_SSLCERT证书必需的密码。
  37. *CURLOPT_COOKIEFILE: 传递一个包含cookie数据的文件的名字的字符串。这个cookie文件可以是Netscape格式,或是堆存在文件中的HTTP风格的头。
  38. *CURLOPT_CUSTOMREQUEST: 当进行HTTP请求时,传递一个字符被GET或HEAD使用。为进行DELETE或其它操作是有益的,更Pass a string to be used instead of GET or HEAD when doing an HTTP request. This is useful for doing or another, more obscure, HTTP request.
  39. 注意: 在确认你的服务器支持命令先不要去这样做。
  40. 下列的选项要求一个文件描述(通过使用fopen()函数获得):
  41. *CURLOPT_FILE: 这个文件将是你放置传送的输出文件,默认是STDOUT.
  42. *CURLOPT_INFILE: 这个文件是你传送过来的输入文件。
  43. *CURLOPT_WRITEHEADER: 这个文件写有你输出的头部分。
  44. *CURLOPT_STDERR: 这个文件写有错误而不是stderr。

一个简单的例子:用来获取页面,并显示获取进度的例子

  1. void CcurlTest1Dlg::OnBnClickedOk()
  2. {
  3. CURL *curl;
  4. CURLcode res;
  5. CStringA retStr;
  6. CString url;
  7. GetDlgItemText(IDC_EDIT2,url);
  8. CProgressCtrl* progress = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS1);
  9. curl_global_init(CURL_GLOBAL_ALL);
  10. curl = curl_easy_init();
  11. if (curl) {
  12. curl_easy_setopt(curl, CURLOPT_URL, UnicodeToAscii(url.GetBuffer(0)).c_str());
  13. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0L);
  14. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0L);
  15. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, ShowHtml);
  16. curl_easy_setopt(curl, CURLOPT_WRITEDATA, &retStr);
  17. curl_easy_setopt(curl, CURLOPT_NOPROGRESS, false);
  18. curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, progress_callback);
  19. curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, progress);
  20. res = curl_easy_perform(curl);
  21. if (res != CURLE_OK)
  22. fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
  23. curl_easy_cleanup(curl);
  24. }
  25. curl_global_cleanup();
  26. SetDlgItemTextW(IDC_EDIT1, Utf8ToUnicode(retStr.GetBuffer()).c_str());
  27. }
  28. size_t CcurlTest1Dlg::ShowHtml(void * ptr, size_t size,
  29. size_t nmemb, void * stream)
  30. {
  31. int return_size = size*nmemb;
  32. CStringA* str = (CStringA*)stream;
  33. *str += (char*)ptr;
  34. Sleep(500);
  35. return return_size;
  36. }
  37. size_t CcurlTest1Dlg::progress_callback(void *clientp, double dltotal, double dlnow, double ultotal, double ulnow)
  38. {
  39. CProgressCtrl* progress = (CProgressCtrl*)clientp;
  40. progress->SetPos(dlnow *100/ dltotal);
  41. return false;
  42. }

http://blog.csdn.net/wyansai/article/details/51241594

VS2015静态编译libcurl(C++ curl封装类)的更多相关文章

  1. Win10 VS2015 静态编译Qt5.6.2源码

    由于VS2015需要CRT等拓展组件,因此把内部编写的工具软件以静态发布,固需要编译Qt源码.Qt5.6.2版本,VS2015,Win10 1.安装python,perl,下载jom 2.改文件com ...

  2. QT + openssl + VS2015静态编译

    从http://slproweb.com/products/Win32OpenSSL.html下载已经编译好的openssl,一路next 我将OpenSSL-Win32\lib\VC目录下的libe ...

  3. 嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  4. [转][linux][centos]嵌入式 Linux下编译并使用curl静态库

    #x86 ./configure --disable-shared --enable-static --disable-ftp --disable-ipv6 --disable-rtsp --disa ...

  5. QT5.7静态编译(使用VS2013与VS2015编译,XP可用,有详细configure脚本。VS下Qt插件的配置。编译选项加上-mp可以开启多线程编译,编译速度提高2倍以上)

    http://blog.csdn.net/u011964923/article/details/52886908 configure -confirm-license -opensource -pla ...

  6. Linux下编译LibCURL

    编译环境 操作系统: Red Hat Enterprise Linux Server release 5.4 64-bit 编译工具: gcc (GCC) 4.1.2 20080704 (Red Ha ...

  7. Windows 编译libcurl(openssl+zlib)(使用VC编译)

    libcurl主要功能就是用不同的协议连接和沟通不同的服务器,如果使用HTTPS,需要OpenSSL libcurl https://curl.haxx.se/download.html 下载Sour ...

  8. Win10 + VS2015 下编译 Qt5.6.0

    近期由于另外一个项目需要用 vs2015 ,于是把 Qt 也升级到了 5.6.0 .由于项目需要兼容 Windows xp ,所以需要自己编译 Qt .这里大致整理一下编译的过程. 安装 Active ...

  9. 记录下 QT Linux 静态编译遇到的坑

    Qt下静态编译Qt,根据我的经验,如果按照Windows下那种直接拿官方sdk安装之后的文件来编译是行不通的,需要直接下载Qt的source包,目前诺基亚的源码叫做qt-everywhere-open ...

随机推荐

  1. 如何在hadoop中控制map的个数 分类: A1_HADOOP 2015-03-13 20:53 86人阅读 评论(0) 收藏

    hadooop提供了一个设置map个数的参数mapred.map.tasks,我们可以通过这个参数来控制map的个数.但是通过这种方式设置map的个数,并不是每次都有效的.原因是mapred.map. ...

  2. Java 网络I/O模型

    网络I/O模型 人多了,就会有问题.web刚出现的时候,光顾的人很少.近年来网络应用规模逐渐扩大,应用的架构也需要随之改变.C10k的问题,让工程师们需要思考服务的性能与应用的并发能力. 网络应用需要 ...

  3. Swift 语言概览 -自己在Xcode6 动手写2-tableView

    import UIKit class ViewController: UIViewController ,UITableViewDelegate, UITableViewDataSource { va ...

  4. 异步FIFO总结

    异步FIFO总结 异步FIFO的基本概念 异步FIFO读写分别采用相互异步的不同时钟,使用异步FIFO可以在两个不同时钟系统之间快速而方便地传输实时数据 FIFO的常见参数 FIFO的宽度:即FIFO ...

  5. js判断是否微信客户端

    上周接到个需求,需求是这样的:用户扫一扫二维码会产生一个链接,该链接会向后端发送个请求,返回一个 apk 的下载地址,用户点击下载按钮可以下载此 apk.然后就发生了问题,经过测试,发现用微信扫一扫打 ...

  6. [TypeScript] Find the repeated item in an array using TypeScript

    Say you have an array that has at least one item repeated. How would you find the repeated item. Thi ...

  7. jQuery笔记-jQuery筛选器children()详解

    jQuery的选择包含两种,一种是选择器,一种是筛选器.筛选器是对选择器选定的jQuery对象做进一步选择. children()是一个筛选器,顾名思义就是筛选孩子,筛选那些符合条件的孩子. 完整的格 ...

  8. DOM 的classList 属性

    1.添加1个或多个class add(class1, class2, ...) 2.移除class remove(class1, class2, ...) 3.判断指定的类名是否存在 contains ...

  9. 【poj3468】A Simple Problem with Integers

    Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 97008   Accepted: 30285 Case Time Limi ...

  10. [Javascript] Identify and Deal with NaN in JavaScript

    Dealing with the special NaN value can be tricky in JavaScript. It behaves like a number and not a n ...