Как скачать веб-страницу с C - PullRequest
1 голос
/ 16 июня 2011

У меня небольшая проблема с C и XML.В основном, код, который я использую:

#include <stdio.h>
#include <curl/curl.h>
#include <libxml/tree.h>
#include <string.h>
#include <stdlib.h>

#define WEBPAGE_URL "http://gdata.youtube.com/feeds/api/videos/mKxLmdBzS10"

typedef struct {
 char *contents;
 int size;
} data;

/*Curl uses this function to write the contents of a webpage to a file/stdout*/
size_t write_data( void *ptr, size_t size, size_t nmeb, void *stream)
{
 data *curl_output = (data *)stream;
 int curl_output_size = size * nmeb;

 curl_output->contents = (char *) realloc(curl_output->contents, curl_output->size +     curl_output_size + 1);
 if (curl_output->contents) {
 memcpy(curl_output->contents, ptr, curl_output_size); /*Copying the contents*/
 curl_output->size += curl_output_size;
 curl_output->contents[curl_output->size] = 0;

return curl_output->size;
 }
}

int main()
{

 data webpage;
 webpage.contents = malloc(1);
 webpage.size = 1;

 CURL *handle = curl_easy_init();
 curl_easy_setopt(handle,CURLOPT_URL,WEBPAGE_URL); /*Using the http protocol*/

 curl_easy_setopt(handle,CURLOPT_WRITEFUNCTION, write_data); /*Setting up the function meant to copy data*/
 curl_easy_setopt(handle,CURLOPT_WRITEDATA, &webpage); /*The data pointer to copy the data*/
 curl_easy_perform(handle);
 curl_easy_cleanup(handle);
 printf("Contents: %s",webpage.contents);
 int i;
}

Я имею в виду, я не получу этот XML обратно: http://gdata.youtube.com/feeds/api/videos/mKxLmdBzS10.

Но в настоящее время я получаю только произвольные суммы назадиногда треть, иногда половина, а иногда просто четверть.

Кто-нибудь знает, что я делаю неправильно?

1 Ответ

1 голос
/ 16 июня 2011

Проблема в вашей функции write_data.

Эта строка копирует новые данные в начало вашего массива, а не в текущий конец.

memcpy(curl_output->contents, ptr, curl_output_size); /*Copying the contents*/

Вам необходимо сместить указатель:

memcpy(curl_output->contents + curl_output->size, ptr, curl_output_size); /* Copying the contents */

Кроме того, ваше возвращаемое значение является плохим - оно должно быть return(curl_output_size); для обозначения успеха, через число байтов, фактически обработанных при вызове, - и ниже скобки, return(0);, чтобы показать ошибку.

Вы также можете найти, что это проясняет ситуацию, если вместо curl_output->size и curl_output_size вы выберете более четкие имена ... возможно curl_output->len?

...