Hi, I am using the following code to download files from the internet:

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();
			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);
			if (res == CURLE_OK)
				printf("Download complete!\n");

How can I measure the current download speed (e.g. every second) and the remaining time to complete the download?

Deleted Member

write_data(...) is callback function which will be called every time each new data portion arrives from internet. So basically you should measure download speed and remaining time in your function write_data():
1. save current time in local variable time1
2. then download speed will be written/(time1-time2) 3. save current time in global variable time2
4. remaining time will be bytes remaining/download speed Current time you can get with functions in time.h.
As about bytes remaining, i am not sure. It should be => total fize size - current file size. The problem is how to get total file size. Check libcurl documentation - maybe there are some functions which probes file sizes on net before downloading it.

good luck.

This article has been dead for over six months. Start a new discussion instead.