getinmemory.c
上传用户:coffee44
上传日期:2018-10-23
资源大小:12304k
文件大小:3k
源码类别:

TAPI编程

开发平台:

Visual C++

  1. /*****************************************************************************
  2.  *                                  _   _ ____  _
  3.  *  Project                     ___| | | |  _ | |
  4.  *                             / __| | | | |_) | |
  5.  *                            | (__| |_| |  _ <| |___
  6.  *                             ___|___/|_| ______|
  7.  *
  8.  * $Id: getinmemory.c,v 1.13 2008-09-06 04:28:45 yangtse Exp $
  9.  *
  10.  * Example source code to show how the callback function can be used to
  11.  * download data into a chunk of memory instead of storing it in a file.
  12.  *
  13.  * This exact source code has not been verified to work.
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <string.h>
  18. #include <curl/curl.h>
  19. #include <curl/types.h>
  20. #include <curl/easy.h>
  21. struct MemoryStruct {
  22.   char *memory;
  23.   size_t size;
  24. };
  25. static void *myrealloc(void *ptr, size_t size);
  26. static void *myrealloc(void *ptr, size_t size)
  27. {
  28.   /* There might be a realloc() out there that doesn't like reallocing
  29.      NULL pointers, so we take care of it here */
  30.   if(ptr)
  31.     return realloc(ptr, size);
  32.   else
  33.     return malloc(size);
  34. }
  35. static size_t
  36. WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
  37. {
  38.   size_t realsize = size * nmemb;
  39.   struct MemoryStruct *mem = (struct MemoryStruct *)data;
  40.   mem->memory = myrealloc(mem->memory, mem->size + realsize + 1);
  41.   if (mem->memory) {
  42.     memcpy(&(mem->memory[mem->size]), ptr, realsize);
  43.     mem->size += realsize;
  44.     mem->memory[mem->size] = 0;
  45.   }
  46.   return realsize;
  47. }
  48. int main(int argc, char **argv)
  49. {
  50.   CURL *curl_handle;
  51.   struct MemoryStruct chunk;
  52.   chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
  53.   chunk.size = 0;    /* no data at this point */
  54.   curl_global_init(CURL_GLOBAL_ALL);
  55.   /* init the curl session */
  56.   curl_handle = curl_easy_init();
  57.   /* specify URL to get */
  58.   curl_easy_setopt(curl_handle, CURLOPT_URL, "http://cool.haxx.se/");
  59.   /* send all data to this function  */
  60.   curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
  61.   /* we pass our 'chunk' struct to the callback function */
  62.   curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)&chunk);
  63.   /* some servers don't like requests that are made without a user-agent
  64.      field, so we provide one */
  65.   curl_easy_setopt(curl_handle, CURLOPT_USERAGENT, "libcurl-agent/1.0");
  66.   /* get it! */
  67.   curl_easy_perform(curl_handle);
  68.   /* cleanup curl stuff */
  69.   curl_easy_cleanup(curl_handle);
  70.   /*
  71.    * Now, our chunk.memory points to a memory block that is chunk.size
  72.    * bytes big and contains the remote file.
  73.    *
  74.    * Do something nice with it!
  75.    *
  76.    * You should be aware of the fact that at this point we might have an
  77.    * allocated data block, and nothing has yet deallocated that data. So when
  78.    * you're done with it, you should free() it as a nice application.
  79.    */
  80.   if(chunk.memory)
  81.     free(chunk.memory);
  82.   /* we're done with libcurl, so clean it up */
  83.   curl_global_cleanup();
  84.   return 0;
  85. }