2013-10-14 16 views
0

我試圖使用libcurl獲取網頁的標題內容並嘗試將其存儲在緩衝區緩衝區中。該程序給出了分段錯誤。我是libcurl的初學者,我不確定問題存在的地方。下面是代碼。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; 
} 
+0

在調試器中運行它。 SO不是調試服務。 –

+0

當您遇到分段錯誤等崩潰時,應該在調試器中運行該程序。調試器將在崩潰時停止,並讓您檢查(甚至走出)函數調用堆棧。如果它在系統函數中停止,那麼直接到堆棧直到到達代碼,然後可以檢查變量的值。 –

+0

@ n.m. @ joachim Pileborg:問題現已解決 –

回答

0

在這裏,我想你應該做的,

HeaderBuffer.bufferlen = nbytes * HeaderBuffer.bufferlen;

,因爲你不知道的nbytes,它可能比2*HeaderBuffer.bufferlen更大。