直接看代碼:
#include <curl/curl.h>
#include <stdio.h>
#include <stdlib.h> //exit
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
int call_url(char *url);
int main(int argc, char **argv)
{
if(argv[1]==NULL)
{
printf("usage:%s url\n",argv[0]);
exit(1);
}
call_url(argv[1]);
return 0;
}
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp)
{
FILE *fp;
int total;
fp=fopen("./index","w+");
if(fp == NULL)
{
printf("cannot open txt.index\n");
return -2;
}
//開始寫
total = fwrite(buffer,size,nmemb,fp);
//寫完
fclose(fp);
return total;
}
int call_url(char *url)
{
// 初始化libcurl
CURLcode return_code;
return_code = curl_global_init(CURL_GLOBAL_ALL);
if (CURLE_OK != return_code)
{
printf("init libcurl failed.");
return -1;
}
CURL *easy_handle = curl_easy_init();
if (NULL == easy_handle)
{
printf("get a easy handle failed.");
curl_global_cleanup();
return -1;
}
//curl_easy_setopt(easy_handle,CURLOPT_URL,"www.baidu.com");
curl_easy_setopt(easy_handle,CURLOPT_URL,url);//
//回調函數
curl_easy_setopt(easy_handle,CURLOPT_WRITEFUNCTION,write_data);//
//如果你沒有通過CURLOPT_WRITEFUNCTION屬性給easy handle設置回調函數
//libcurl會提供一個默認的回調函數,它只是簡單的將接收到的數據打印到標準輸出。
//你也可以通過CURLOPT_WRITEDATA屬性給默認回調函數傳遞一個已經打開的文件指針,
//執行請求
curl_easy_perform(easy_handle);
curl_easy_cleanup(easy_handle);
curl_global_cleanup();
}
說下回調函數writedata
size_t write_data(void *buffer, size_t size, size_t nmemb, void *userp);
這個回調函數被調用的時機是有響應數據到達,這些數據由ptr指向,大小是sizenmemb.到這裏爲止還是文檔上的說法.從socket的角度考慮,響應數據自然不一定會是以0結尾的字符串,而應當被認爲是流數據.只要服務端沒有關閉連接,只要服務端還在發送響應數據,這個函數就會被調用,而被調用的次數不一定只是一次,也許會是許多次,每一次被調用所接收到的數據大小是sizenmemb,這些文檔上似乎沒有提到,因爲這是理當如此的事情.所以在處理響應數據的時候不能想當然,必須要考慮到這個函數會被多次調用.
再說說userdata,這是一個FILE *的指針,這個參數跟CURLOPT_WRITEDATA相關,如果已經自己寫了回調函數,而不是用缺省的回調函數把接收到的數據寫到用CURLOPT_WRITEDATA所設置的userdata所指向的文件當中去,那麼就可以把這個指針設爲NULL.
結果: