2011-05-01 6 views
1

Je suis en train de télécharger un fichier de test de mon serveur en utilisant la bibliothèque cURL avec ce code:Segmentation En utilisant cURL

#define CURL_STATICLIB 

#include <stdio.h> 
#include <curl/curl.h> 
#include <curl/types.h> 
#include <curl/easy.h> 
#include <string.h> 

size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) 
{ 
    size_t written; 

    written = fwrite(ptr, size, nmemb, stream); 
    return written; 
} 

int main(void) 
{ 
    CURL *curl; 
    FILE *fp; 
    CURLcode res; 

    char *url = "http://pixhost.tk/test.txt"; 
    char outfilename[FILENAME_MAX] = "/Users/Nathan/Desktop"; 
    curl = curl_easy_init(); 

    if (curl) 
    { 
     fp = fopen(outfilename, "wb"); 

     curl_easy_setopt(curl, CURLOPT_URL, url); 
     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
     curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); 

     res = curl_easy_perform(curl); 

     curl_easy_cleanup(curl); 
     fclose(fp); 
    } 

    return 0; 
} 

et la compilation comme ceci:

$ gcc main.c -lcurl -o curltest 

Mais quand je l'exécuter, j'obtiens une erreur de segmentation. Que dois-je faire pour corriger cela?

Répondre

3

Je ne suis pas familier avec cURL, mais deux choses qui pourraient vous aider, alors pardonnez-moi si je parle un non-sens:

  1. char *url = "http://pixhost.tk/test.txt"; est une chaîne de lecture seule, donc changer pour const char *url = "http://pixhost.tk/test.txt"; cela pourrait révéler votre problème lors de la compilation.
  2. Vous ne vérifiez pas le résultat de fopen, peut-être qu'il a échoué, ce qui explique le segfault, et il me semble probable puisque vous essayez d'ouvrir "/ Users/Nathan/Desktop" qui devrait être un répertoire AFAIK.
+0

Je mets mes paris sur 2. – a3nm

+0

Moi aussi, a3_nm. On dirait qu'il essaie d'ouvrir un répertoire pour écrire. –

0

Il a été un moment que je travaillais avec boucle, et je ne suis pas sûr que cela causerait une erreur de segmentation, je pense que vous devriez appellerez fwrite comme ceci:

fwrite(ptr, 1, nmemb * size, stream); 

Parce que fwrite retourne le nombre des éléments écrits, et size n'est pas (je ne pense pas) garanti pour être un. Et puisque vous renvoyez ce que fwrite renvoie, je crois que vous retournez moins d'octets que vous écrivez réellement, puisque la fonction est supposée renvoyer le nombre d'octets qu'elle a écrits.