使用libcurl
cURL的easy接口是一個簡單的同步API嫂易,能控制數(shù)據(jù)移動過程(使用回調(diào))
示例:
#include <stdio.h>
#include "curl/curl.h"
struct TransFile {
const char *filename;
FILE *stream;
};
size_t write_data( void *buffer, size_t size, size_t nmemb, void *stream);
int main()
{
CURL *curl;
CURLcode ret;
struct TransFile transfile = {
"example.pdf",
NULL
};
curl_global_init(CURL_GLOBAL_DEFAULT);
curl = curl_easy_init();//初始化一個curl指針
if (!curl) {
printf("couldn't init curl\n");
return 0;
}
//設(shè)置要下載的文件的URL
curl_easy_setopt(curl,CURLOPT_URL,"http://www.mysite.com/example.pdf");
/*執(zhí)行寫入文件流操作*/
curl_easy_setopt( curl, CURLOPT_WRITEFUNCTION, write_data);//調(diào)用回調(diào)函數(shù)
curl_easy_setopt( curl,CURLOPT_WRITEDATA, &transfile);//傳入回調(diào)函數(shù)需要的結(jié)構(gòu)體的指針
curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L);
curl_easy_setopt( curl, CURLOPT_USERPWD, "SUREN:SUREN");
//寫入文件
ret = curl_easy_perform(curl);
//釋放curl對象
curl_easy_cleanup(curl);
if(ret != CURLE_OK) {
fprintf(stderr,"%d",ret);
}
//關(guān)閉文件流
if(transfile.stream) {
fclose(transfile.stream);
}
//釋放全局curl對象
curl_global_cleanup();
return 0;
}
size_t write_data( void *buffer, size_t size, size_t nmemb, void *stream)
{
struct TransFile *out = (struct TransFile *)stream;
printf("2.1\n");
if(out && (!out->stream)) {
printf("2.2\n");
out->stream = fopen(out->filename, "wb");
printf("2.3\n");
if(!out -> stream) {
printf("fopen failed!\n");
return -1;
}
}
return fwrite(buffer,size,nmemb,out->stream);
}
編譯上面的程序,通過它下載文件(當(dāng)然你需要修改程序中的url)來和通過瀏覽器下載直接對比曼尊,結(jié)果見http://www.reibang.com/p/50a620d08bc9
接口說明
這些接口通過手冊之類的都可以查到詳細(xì)信息
curl_easy_init()
創(chuàng)建一個簡單的句柄本慕。
curl_easy_setopt()
為句柄設(shè)置屬性和選項疗杉,控制即將進(jìn)行的轉(zhuǎn)移和轉(zhuǎn)移方式。例如:curl_easy_setopt(curl,option,value);
屬性說明:
屬性說明:
CURLOPT_URL:提供請求中使用的URL
-
CURLOPT_TIMEOUT:設(shè)置允許libcurl傳輸操作花費的最大時間
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 20L);
-
CURLOPT_HTTP_VERSION:設(shè)置HTTP協(xié)議版本椎组,value可選:
- CURL_HTTP_VERSION_NONE
- CURL_HTTP_VERSION_1_0
- CURL_HTTP_VERSION_1_1
- CURL_HTTP_VERSION_2_0
- CURL_HTTP_VERSION_2TLS
- CURL_HTTP_VERSION_2_PRIOR_KNOWLEDGE
-
CURLOPT_NOPROGRESS:關(guān)閉程序meter
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
-
CURLOPT_NOBODY:發(fā)送不帶body的請求
curl_easy_setopt(curl丹拯,CURLOPT_NOBODY,1L);
-
CURLOPT_HEADERFUNCTION:使用回調(diào)函數(shù)
當(dāng)收到頭信息的時斤程,調(diào)用回調(diào)函數(shù)
static size_t header_callback(char *buffer, size_t size, size_t nitems, void *userdata) { /* received header is nitems * size long in 'buffer' NOT ZERO TERMINATED */ /* 'userdata' is set with CURLOPT_HEADERDATA */ return nitems * size; } CURL *curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://example.com"); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, header_callback); curl_easy_perform(curl); }
-
CURLOPT_WRITEDATA:傳遞給寫回調(diào)的自定義指針
如果已經(jīng)設(shè)置了CURLOPT_WRITEFUNCTION選項角寸,該指針就是傳遞給寫回調(diào)的第4個參數(shù)