簡體   English   中英

libcurl獲取緩沖區中的標頭內容

[英]Libcurl to get the header content in a buffer

我試圖使用libcurl獲取網頁的標頭內容,然后嘗試將其存儲在charecter緩沖區中。程序給出了分段錯誤。 我是libcurl的初學者,我不確定問題出在哪里。這是下面的代碼。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <assert.h>

#include <curl/curl.h>



struct buf {
    char *buffer;
    size_t bufferlen;
    size_t writepos;
} buffer = {0};

struct buf HeaderBuffer;

static size_t write_data(void *ptr, size_t size, size_t nmemb, char *string)
{
  size_t nbytes = size*nmemb;
    if (!HeaderBuffer.buffer) {
        HeaderBuffer.buffer = malloc(1024);
        HeaderBuffer.bufferlen = 1024;
        HeaderBuffer.writepos = 0;
    }
    if (HeaderBuffer.writepos + nbytes < HeaderBuffer.bufferlen) {
        HeaderBuffer.bufferlen = 2 * HeaderBuffer.bufferlen;
        HeaderBuffer.buffer = (char *)realloc(HeaderBuffer.buffer, buffer.bufferlen);
    }
    assert(HeaderBuffer.buffer != NULL);
    memcpy(HeaderBuffer.buffer+HeaderBuffer.writepos,ptr,nbytes);
    return nbytes;

}

int main(void)
{
  CURL *curl_handle;

  curl_global_init(CURL_GLOBAL_ALL);

  /* init the curl session */ 
  curl_handle = curl_easy_init();


  curl_easy_setopt(curl_handle, CURLOPT_URL, "http://example.com");


  /* send all data to this function  */ 
  curl_easy_setopt(curl_handle,CURLOPT_HEADERFUNCTION, write_data); 

  /* get it! */ 
  curl_easy_perform(curl_handle);



printf("%s",HeaderBuffer.buffer);



  /* cleanup curl stuff */ 
  curl_easy_cleanup(curl_handle);

  return 0;
}

編輯:

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

struct string {
  char *ptr;
  size_t len;
};

void init_string(struct string *s) {
  s->len = 0;
  s->ptr = (char *)malloc(s->len+1);
  if (s->ptr == NULL) {
    fprintf(stderr, "malloc() failed\n");
    exit(1);
  }
  s->ptr[0] = '\0';
}

size_t writefunc(void *ptr, size_t size, size_t nmemb, struct string *s)
{
  size_t new_len = s->len + size*nmemb;
  s->ptr =(char *) realloc(s->ptr, new_len+1);
  if (s->ptr == NULL) {
    fprintf(stderr, "realloc() failed\n");
    exit(EXIT_FAILURE);
  }
  memcpy(s->ptr+s->len, ptr, size*nmemb);

  //sprintf (s->ptr+s->len,"New header:\n%s\n",(char *)ptr);


  s->ptr[new_len] = '\0';
  s->len = new_len;

  return size*nmemb;
}

int main(void)
{
  CURL *curl;
  CURLcode res;
  char url[50];



  char *ptr=NULL;
  int i=0;

  memset(Buffer,0,255);

  strcpy(url,"http://");
  strncat(url,"74.125.236.176",strlen("74.125.236.176"));

  curl = curl_easy_init();
  if(curl) {
    struct string s;
    init_string(&s);
    curl_easy_setopt(curl, CURLOPT_URL,url);


    curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, writefunc);
    curl_easy_setopt(curl, CURLOPT_WRITEHEADER, &s);
    res = curl_easy_perform(curl);



     printf("\n \n %s",Buffer);

    printf("%s\n", s.ptr);




    free(s.ptr);

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

我想你應該在這里

HeaderBuffer.bufferlen = nbytes * HeaderBuffer.bufferlen;

由於您不知道nbytes,因此它可能大於2*HeaderBuffer.bufferlen

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM