前段时间写了个linux下的多线程下载工具, 使用到了强大的libcurl库. 现将libcurl的使用总结如下:
关于libcurl的文章网络上很多, 这里不再描述. 以下是如何使用libcurl的例子.
应该在程序开始时调用初始化函数. 虽然不调用这个初始化函数, libcurl会在curl_easy_init()函数中自动调用. 但在多线程处理时, 可能会出现多次自动调用的情况.
3) 设置下载属性. 及常用参数.
-
CURLcode curl_easy_setopt(CURL *handle, CURLoption option, parameter);
1. 设置下载数据的回调函数.
-
option:
-
CURLOPT_WRITEFUNCTION //设置回调函数
回调函数原型为: size_t function( void *ptr, size_t size, size_t nmemb, void *userp); 函数将在libcurl接收到数据后被调用。
void *ptr是下载回来的数据.
void *userp是用户指针, 用户通过这个指针传输自己的数据.
-
CURLOPT_WRITEDATA
-
设置回调函数中的void *userp指针的来源。
2. 下载进度控制.
-
option:
-
CURLOPT_NOPROGRESS
-
为了使CURLOPT_PROGRESSFUNCTION被调用. CURLOPT_NOPROGRESS必须被设置为false.
-
CURLOPT_PROGRESSFUNCTION
-
CURLOPT_PROGRESSFUNCTION 指定的函数正常情况下每秒被libcurl调用一次.
-
CURLOPT_PROGRESSDATA
-
CURLOPT_PROGRESSDATA指定的参数将作为CURLOPT_PROGRESSFUNCTION指定函数的参数.
-
整个处理与下载数据回调的处理相同.
-
3. 其它常用属性.
option:
-
CURLOPT_URL
-
设置访问的URI.
-
CURLOPT_NOSIGNAL
-
屏蔽其它信号.
-
CURLOPT_HEADER
-
取数据时连同HTTP头部一起取回.
-
CURLOPT_HEADERFUNCTION
-
CURLOPT_HEADERDATA
-
只取HTTP头部数据, 处理与下载数据回调的处理相同.
-
CURLOPT_TIMEOUT
-
超时时间.
-
CURLOPT_CONNECTIONTIMEOUT
-
连接等待时间.
-
CURLOPT_FOLLOWLOCATION
-
设置支持302重定向
-
CURLOPT_RANGE
-
断点续传, 指定传输分片, 格式:"0-200"
二、例程
获取网站包括HTTP头部信息在内的500字节数据.
-
size_t callback_get_head(void *ptr, size_t size, size_t nmemb, void *userp)
{
strcat( userp, ptr);
return size * nmemb; //必须返回这个大小, 否则只回调一次, 不清楚为何.
}
void *get_head_thread(void *)
{
CURL *curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, ""); //设置下载的URI
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20); //设置超时
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1); //屏蔽其它信号
curl_easy_setopt(curl, CURLOPT_HEADER, 1); //下载数据包括HTTP头部
curl_easy_setopt(curl, CURLOPT_RANGE, "0-500"); //用于断点续传, 设置下载的分片
char buffer[MAXHEADLEN] = {0x0};
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, callback_get_head); //设置下载数据的回调函数
curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
curl_easy_perform(curl);
curl_easy_cleanup(curl);
//此时网站HTTP头信息已经存放在buffer内.
}
说明: void *get_head_thread(void *), 从函数名就可以看出, 这个函数内部的libcurl操作可以放到多线程进行处理, 唯一要注意的就是libcurl的全局初始化必须放在线程之外.
end.