目录
1 libcurl简介
2 libcurl编译
3 使用步骤
4 函数说明
4.1 全局初始化函数 curl_global_init
4.2 全局释放函数 curl_global_cleanup
4.3 libcurl库版本 curl_version
4.4 开启会话 curl_easy_init
4.5 结束会话 curl_easy_cleanup
4.6 设置传输选项 curl_easy_setopt
4.7 执行传输任务 curl_easy_perform
5 演示Demo
5.1 开发环境
5.2 示例代码
5.3 下载地址
1 libcurl简介
libcurl是一个跨平台的网络协议库,支持http, https, ftp, gopher, telnet, dict, file, 和ldap等协议。libcurl同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传, HTTP基本表单上传,代理,cookies,和用户认证。
官网:https://curl.haxx.se/
2 libcurl编译
Windows平台libcurl库的下载地址:curl for Windows
注意:下载的Windows库,只包含头文件和dll库,缺少lib文件。
可用VS编译器自带工具命令行根据def文件和dll文件生成lib文件
以“管理员身份”运行cmd,进行VS的安装路径,把def文件和dll文件放到VC\bin目录下,然后执行:
lib /machine:x64 /def:libcurl-x64.def //生产64位lib文件libcurl-x64.lib
lib /machine:x86 /def:libcurl.def //生产32位lib文件libcurl.lib
3 使用步骤
- 调用curl_global_init()初始化libcurl
- 调用curl_easy_init()函数得到CURL指针
- 根据curl_easy_setopt()设置传输选项,设置回调函数以完成用户特定任务
- 调用curl_easy_perform()函数执行传输任务
- 调用curl_easy_cleanup()释放内存
- 调用curl_global_cleanup()析构libcurl
在整个过程中设置curl_easy_setopt()参数是最关键的,几乎所有的libcurl程序都要使用它。
在基于libcurl的程序里,主要采用callback function(回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libcurl将调用用户的回调函数实现特定功能。
4 函数说明
4.1 全局初始化函数 curl_global_init
/*
功能:全局初始化
参数:flags - [in] CURL_GLOBAL_ALL //初始化所有的可能的调用。
CURL_GLOBAL_SSL //初始化支持 安全套接字层。
CURL_GLOBAL_WIN32 //初始化win32套接字库。
CURL_GLOBAL_NOTHING //没有额外的初始化。
返回:0-成功,其他-失败
*/
CURLcode curl_global_init(long flags);
这个函数只能用一次。如果这个函数在curl_easy_init函数调用时还没调用,它将由libcurl库自动调用,所以多线程下最好主动调用该函数以防止在线程中curl_easy_init时多次调用。
注意:虽然libcurl是线程安全的,但curl_global_init是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
4.2 全局释放函数 curl_global_cleanup
/*
功能:全局释放
参数:
返回:
*/
void curl_global_cleanup(void);
在结束libcurl使用的时候,用来对curl_global_init做的工作清理。类似于close的函数。
注意:虽然libcurl是线程安全的,但curl_global_cleanup是不能保证线程安全的,所以不要在每个线程中都调用curl_global_init,应该将该函数的调用放在主线程中。
4.3 libcurl库版本 curl_version
/*
功能:libcurl库版本
参数:
返回:libcurl库版本
*/
char *curl_version(void);
4.4 开启会话 curl_easy_init
/*
功能:初始化CURL指针
参数:
返回:CURL指针
*/
CURL *curl_easy_init(void);
curl_easy_init用来初始化一个CURL的指针(有些像返回FILE类型的指针一样),相应的在调用结束时要用curl_easy_cleanup函数清理。
一般curl_easy_init意味着一个会话的开始。它会返回一个easy_handle(CURL*对象),一般都用在easy系列的函数中。
4.5 结束会话 curl_easy_cleanup
/*
功能:释放CURL指针
参数:curl - [in] CURL指针
返回:
*/
void curl_easy_cleanup(CURL *curl);
这个调用用来结束一个会话,与curl_easy_init配合着用。
4.6 设置传输选项 curl_easy_setopt
/*
功能:设置传输选项
参数:curl - [in] CURL指针
option - [in] 传输选项参数
返回:0-成功,其他-失败
*/
CURLcode curl_easy_setopt(CURL *curl, CURLoption option, ...);
这个函数最重要了。几乎所有的curl 程序都要频繁的使用它。它告诉curl库,程序将有如何的行为,比如要查看一个网页的html代码等。(这个函数有些像ioctl函数)
4.7 执行传输任务 curl_easy_perform
/*
功能:执行传输任务
参数:curl - [in] CURL指针
返回:0-成功,其他-失败
*/
CURLcode curl_easy_perform(CURL *curl);
5 演示Demo
5.1 开发环境
- curl-8.4.0_6
- Visual Studio 2015
- Windows 10 Pro x64
5.2 示例代码
- 调用curl_global_init()初始化libcurl
- 调用curl_easy_init()函数得到CURL指针
- 根据curl_easy_setopt()设置传输选项,设置回调函数以完成用户特定任务
- 调用curl_easy_perform()函数执行传输任务
- 调用curl_easy_cleanup()释放内存
- 调用curl_global_cleanup()析构libcurl
int main()
{
// 调用curl_version,获取版本信息
printf("%s\n\n",curl_version());
// 调用curl_global_init 全局初始化
curl_global_init(CURL_GLOBAL_ALL);
// 调用curl_easy_init()函数得到 easy interface型指针
CURL* client = curl_easy_init();
// 调用curl_easy_setopt()设置传输选项(通过调用curl_easy_setopt这个函数来对指针进行各种配置,比如:请求的方式)
curl_easy_setopt(client, CURLOPT_URL, "http://www.baidu.com");
// 调用curl_easy_perform()函数进行访问请求
curl_easy_perform(client);
// 调用curl_easy_cleanup()释放内存
curl_easy_cleanup(client);
// 调用curl_global_cleanup 全局释放
curl_global_cleanup();
return 0;
}
5.3 下载地址
开发环境:
- Windows 10 pro x64
- Visual Studio 2015
- curl-8.4.0_6
下载地址: libcurl网络协议库使用Demo