二、Linux C語言使用libcurl訪問網頁並保存網頁信息到本地

直接看代碼:

#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.

結果:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章