libcurl 笔记

来自https://curl.haxx.se/libcurl/c/libcurl-tutorial.html

初始化

参数指定要初始化的模块
curl_global_init(CURL_GLOBAL_ALL);

CURL_GLOBAL_WIN32
CURL_GLOBAL_SSL

当不再使用libcurl时调用:
curl_global_cleanup();

查询libcurl支持的特性

curl_version_info()

libcurl提供两种接口

1. easy interface – 函数以curl_easy为前缀,同步、阻塞调用
(let you do single transfers with a synchronous and blocking function call)
2. multi interface – allows multiple simultaneous transfers in a single thread

Easy libcurl

首先获得一个句柄,该句柄不能被多个线程共享
easyhandle = curl_easy_init();

设置选项,用于接下来的传输
设置的选项将一直保持,直到下一次修改
curl_easy_setopt()

重置选项
curl_easy_reset()
复制句柄,连同其选项
curl_easy_duphandle()

常用的选项比如URL
curl_easy_setopt(handle, CURLOPT_URL, “http://domain.com/”);

假设想要接收上面指定的链接处收到的数据,默认输出到stdout
可以设置自己的回调函数处理该数据
回调函数:
size_t write_data(void* buffer, size_t size, size_t nmemb, void* userp);
设置回调函数
curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, write_data);
设置回调函数第四个参数接收的自定义数据
可以将文件句柄传入第四个参数,比如FILE*
curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA, &internal_struct);

执行任务
该函数连接到远程地址,传输数据,当接收到文件时,之前设置的回调函数会被调用
success = curl_easy_perform(easyhandle);

对于某些协议,比如FTP,下载一个文件需要登录、设置传输模式、改变当前目录然后传输文件数据等一系列步骤,libcurl会自动处理这些步骤,开发人员只需要提供这个需要下载的文件的URL。

多线程

libcurl是线程安全的 多线程专题https://curl.haxx.se/libcurl/c/threadsafe.html

调试

传输可能会因为某些原因失败
调试用选项
CURLOPT_VERBOSE
CURLOPT_HEADER
CURLOPT_DEBUGFUNCTION

如果了解某些传输协议,学习协议的RFC文档,用利于更好地理解和使用libcurl

待续…

发布者

yjwx0017

C++软件工程师