LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP
、FTP
、SMTP
、POP3
等协议的功能,使用libcurl
可以方便地进行网络数据传输操作,如发送HTTP
请求、下载文件、发送电子邮件等。它被广泛应用于各种网络应用开发中,特别是涉及到数据传输的场景。
首先读者需要自行下载该库,如下笔者选择下载curl-8.0.1.zip
这个源代码版本,读者可找到如下页面,并点击对应版本完成下载,当下载好以后读者可自行将其解压缩到任意目录下。
当读者解压缩后,可打开VS2013 开发人员命令提示
并切换带该目录中的curl-8.0.1\winbuild
目录,通过执行如下两条命令即可分别实现编译静态库或动态库,我们以静态库编译为主,执行如下命令读者可自行等待一段时间。
- 动态库: nmake /f Makefile.vc mode=dll VC=13 MACHINE=x86 DEBUG=no
- 静态库: nmake / f Makefile.vc mode = static VC = 13 ENABLE_IDN = no MACHINE = x86 DEBUG = no
这个库在编译通过后会自动生成文件到builds\libcurl-vc13-x86-release-static-ipv6-sspi-schannel
目录内,读者可自行打开该目录,即可看到该目录内的头文件以及库目录文件,如下图所示;
读者可自行配置这个静态库,通常只需要配置include
和lib
文件即可,该库的使用很简单,首先我们需要调用curl_easy_init()
函数对CURL
对象进行初始化,接着通过调用curl_easy_setopt()
并传入一个访问URL
链接,当访问成功后则可调用curl_easy_perform()
函数得到访问结果,这就是该库基本使用方法,如下代码。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")
#pragma comment (lib,"ws2_32.lib")
#pragma comment (lib,"Crypt32.lib")
using namespace std;
int main(int argc, char *argv[])
{
CURL *curl;
CURLcode res;
curl = curl_easy_init();
if (curl)
{
curl_easy_setopt(curl, CURLOPT_URL, "https://www.lyshark.com");
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
}
std::cout << "返回状态: " << res << std::endl;
system("pause");
return 0;
}
运行上述代码,读者可看到网站www.lyshark.com
的源代码,如下图所示;
上述代码中的curl_easy_setopt()
函数第二个参数可以使用多种类型的变量定义,我们可以通过传入不同的常量来定义请求头中的参数,例如当我们需要修改协议头时,可以使用CURLOPT_HTTPHEADER
常量,并在其后第三个参数中传入该常量所对应的结构即可,这个结构体定义有许多类型,具体如下下表所示;
常量名称 | 描述 |
---|---|
CURLINFO_EFFECTIVE_URL | 最后一个有效的URL地址 |
CURLINFO_HTTP_CODE | 最后一个收到的HTTP代码 |
CURLINFO_FILETIME | 远程获取文档的时间,如果无法获取,则返回值为-1 |
CURLINFO_TOTAL_TIME | 最后一次传输所消耗的时间 |
CURLINFO_NAMELOOKUP_TIME | 名称解析所消耗的时间 |
CURLINFO_CONNECT_TIME | 建立连接所消耗的时间 |
CURLINFO_PRETRANSFER_TIME | 从建立连接到准备传输所使用的时间 |
CURLINFO_STARTTRANSFER_TIME | 从建立连接到传输开始所使用的时间 |
CURLINFO_REDIRECT_TIME | 在事务传输开始前重定向所使用的时间 |
CURLINFO_SIZE_UPLOAD | 以字节为单位返回上传数据量的总值 |
CURLINFO_SIZE_DOWNLOAD | 以字节为单位返回下载数据量的总值 |
CURLINFO_SPEED_DOWNLOAD | 平均下载速度 |
CURLINFO_SPEED_UPLOAD | 平均上传速度 |
CURLINFO_HEADER_SIZE | header部分的大小 |
CURLINFO_HEADER_OUT | 发送请求的字符串 |
CURLINFO_REQUEST_SIZE | 在HTTP请求中有问题的请求的大小 |
CURLINFO_SSL_VERIFYRESULT | 通过设置CURLOPT_SSL_VERIFYPEER返回的SSL证书验证请求的结果 |
CURLINFO_CONTENT_LENGTH_DOWNLOAD | 从Content-Length: field中读取的下载内容长度 |
CURLINFO_CONTENT_LENGTH_UPLOAD | 上传内容大小的说明 |
CURLINFO_CONTENT_TYPE | 下载内容的Content-Type:值,NULL表示服务器没有发送有效的Content-Type:header |
如下案例是一个简单的GET
请求封装,通过调用GetStatus()
函数实现对特定页面发起请求的功能,其中curl_slist_append()
用于增加新的请求头数据,在调用curl_easy_setopt()
函数时,分别传入了CURLOPT_HTTPHEADER
设置请求头,CURLOPT_WRITEFUNCTION
设置回调,CURLINFO_PRIMARY_IP
获取目标IP
地址,CURLINFO_RESPONSE_CODE
获取目标返回代码,此处的write_data()
函数直接返回0则表示屏蔽所有的页面输出内容。
#define CURL_STATICLIB
#define BUILDING_LIBCURL
#include <iostream>
#include "curl/curl.h"
#pragma comment (lib,"libcurl_a.lib")
#pragma comment (lib,"wldap32.lib")