小记 libcurl下载

来源:互联网 发布:章子怡 宫二 知乎 编辑:程序博客网 时间:2024/06/18 00:14

#include "stdafx.h"

#include "../../curl/curl.h"

 

#pragma comment(lib, "curllib.lib")

 

struct MemoryStruct 

{

char *memory;

size_t size;

}; 

 

//添加一个全局变量 

struct MemoryStruct chunk; 

static void *myrealloc(void *ptr, size_t size)

{

/* There might be a realloc() out there that doesn't like reallocing

NULL pointers, so we take care of it here */

if(ptr)

return realloc(ptr, size);

else

return malloc(size);

}

 

static size_t

WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)

{

size_t realsize = size * nmemb;

//我们给定了一个足够大的内存,不需要重新申请 

struct MemoryStruct *mem = (struct MemoryStruct *)data; 

mem->memory = (char *)myrealloc(mem->memory, mem->size + realsize + 1);

if (mem->memory) {

memcpy(&(mem->memory[mem->size]), ptr, realsize);

mem->size += realsize;

mem->memory[mem->size] = 0;

}

return realsize;

 

int getFileInBuffer() 

{

CURL *curl_handle; 

chunk.memory=NULL; /* we expect realloc(NULL, size) to work */

chunk.size = 0;    /* no data at this point */ 

curl_global_init(CURL_GLOBAL_ALL); 

/* init the curl session */

curl_handle = curl_easy_init(); 

/* specify URL to get */

curl_easy_setopt(curl_handle, CURLOPT_URL, "http://img1.gtimg.com/sports/pics/hv1/117/247/625/40703727.jpg"); 

/* send all data to this function */

curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback); 

/* we pass our 'chunk' struct to the callback function */

curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk); 

/* some servers don't like requests that are made without a user-agent

field, so we provide one */

curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0"); 

/* get it! */

curl_easy_perform(curl_handle); 

/* cleanup curl stuff */

curl_easy_cleanup(curl_handle); 

/*

* Now, our chunk.memory points to a memory block that is chunk.size

* bytes big and contains the remote file.

*

* Do something nice with it!

*

* You should be aware of the fact that at this point we might have an

* allocated data block, and nothing has yet deallocated that data. So when

* you're done with it, you should free() it as a nice application.

*/ 

if(chunk.memory)

{

{

FILE* file = fopen("e://downfile", "w+b");

if (file)

{

fwrite(chunk.memory, chunk.size, 1, file);

fflush(file);

fclose(file);

}

}

 

free(chunk.memory); 

}

/* we're done with libcurl, so clean it up */

curl_global_cleanup(); 

return chunk.size;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

getFileInBuffer(); 

 

return 0;

}