2010-08-09 14 views
0

J'utilise le code suivant pour télécharger des fichiers depuis Internet:C libcurl - mesure la vitesse de téléchargement et le temps restant

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(int argc, char** argv) 
{ 
FILE *downloaded_file; 
if ((downloaded_file = fopen (download_path , "w")) != NULL) 
{ 
    CURL *curl; 
    CURLcode res; 
    curl = curl_easy_init(); 
    if(curl) 
    { 
    curl_easy_setopt(curl, CURLOPT_URL, "www.asd.com/files/file_to_download.rar"); 
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); 
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, downloaded_file); 
    res = curl_easy_perform(curl); 
    curl_easy_cleanup(curl); 

    if (res == CURLE_OK) 
    { 
    printf("Download complete!\n"); 
    } 
    } 
    fclose(downloaded_file); 
} 
} 

Comment puis-je mesurer la vitesse de téléchargement en cours (par exemple toutes les secondes) et le temps restant à compléter le téléchargement?

Répondre

3

Vous pouvez utiliser CURLOPT_PROGRESSFUNCTION. curl passera 5 arguments à votre fonction de rappel, clientp, dltotal, dlnow, ultotal et ulnow. clientp est un pointeur que vous fournissez avec CURLOPT_PROGRESSDATA. Les paramètres totaux sont les quantités totales qui doivent être téléchargées; les maintenant sont les montants jusqu'à présent. Les valeurs inconnues sont 0.

Pour l'utiliser, vous devez définir CURLOPT_NOPROGRESS à 0.

+0

Ceci est pour la barre de progression, comment puis-je utiliser pour mesurer la vitesse? –

+3

La vitesse de téléchargement moyenne générale est dlnow/(heure actuelle - heure de début). La vitesse de téléchargement "actuelle" est un peu plus délicate. D'abord, vous devez définir ce que cela signifie. Une possibilité est d'avoir un old_time, et old_now. Alors c'est (dlnow - oldNow)/(heure actuelle - oldTime). –

+0

après 6 ans toujours un commentaire très utile: P Merci que speed = ((NowDownloaded - lastDownloadedBytes)/(QTime(). CurrentTime(). Second() - oldTime.second())/1024); totalement travaillé pour moi xD –