libcurl: вывод скорости загрузки по сети не точен

Я использовал библиотеки libcurl для расчета скорости загрузки по сети. Я использую следующие коды. Но скорость загрузки и выгрузки не является точной по сравнению с исходной скоростью сети. (мой вывод составляет около 1,3 КБ / с, 370 КБ / с по сравнению с исходными 500 КБ / с для загрузки и 1 МБ / с для загрузки)

Будет очень полезно, если кто-нибудь сможет рассказать о причинах этого и о том, что мне следует сделать, чтобы получить правильную скорость загрузки. Новые процедуры для расчета ставок также приветствуются.

#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>

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

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

int main(void) {
CURL *curl;
CURL *curl1;
FILE *fp;
CURLcode res;
CURLcode res1;
char *url =
"https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency
_demonstration_1.png";
char outfilename[FILENAME_MAX] = "aaa.jpg";
curl = curl_easy_init();
curl1 = curl_easy_init();
struct stat file_info;
double speed_upload, total_time1;
FILE *fd;

fd = fopen("aaa.jpg", "rb");
if(!fd)
return 1;

if(fstat(fileno(fd), &file_info) != 0)
return 1;

if(curl1) {
curl_easy_setopt(curl1, CURLOPT_URL,
"https://upload.wikimedia.org/wikipedia/commons/4/47/PNG_transparency_demonstration_1.png");
curl_easy_setopt(curl1, CURLOPT_UPLOAD, 1L);

curl_easy_setopt(curl1, CURLOPT_READDATA, fd);

curl_easy_setopt(curl1, CURLOPT_INFILESIZE_LARGE,(curl_off_t)file_info.st_size);

curl_easy_setopt(curl1, CURLOPT_VERBOSE, 1L);

res1 = curl_easy_perform(curl1);
/* Check for errors */
if(res1 != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n",
curl_easy_strerror(res1));

}
else {
curl_easy_getinfo(curl1, CURLINFO_SPEED_UPLOAD, &speed_upload);
curl_easy_getinfo(curl1, CURLINFO_TOTAL_TIME, &total_time1);

fprintf(stderr, "Speed: %.3f bytes/sec during %.3f seconds\n",
speed_upload, total_time1);

}
curl_easy_cleanup(curl1);
fclose(fd);
}
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);

if (CURLE_OK == res) {
double val;

res = curl_easy_getinfo(curl, CURLINFO_SIZE_DOWNLOAD, &val);
if ((CURLE_OK == res) && (val>0))
printf("Data downloaded: %0.0f bytes.\n", val);

res = curl_easy_getinfo(curl, CURLINFO_TOTAL_TIME, &val);
if ((CURLE_OK == res) && (val>0))
printf("Total download time: %0.3f sec.\n", val);

res = curl_easy_getinfo(curl, CURLINFO_SPEED_DOWNLOAD, &val);
if ((CURLE_OK == res) && (val>0))
printf("Average download speed: %0.3f kbyte/sec.\n", val / 1024);

}
else {
fprintf(stderr, "Error while fetching '%s' : %s\n",
url, curl_easy_strerror(res));
}
curl_easy_cleanup(curl);
fclose(fp);
}
return 0;
}

0

Решение

Там нет идеального решения вашей проблемы. Вы не можете точно измерить скорость сети вашего провайдера, передав изображение в / из Википедии, потому что это также касается собственной сети Википедии и магистрали Интернета между вами и Википедией. Вы не единственный пользователь Интернета, поэтому ваша пропускная способность используется многими другими. Поэтому, когда вы передаете изображение в / из Википедии, получаемая вами скорость является всего лишь мгновенным измерением состояния сети между вами и Википедией, и если вы повторите это через минуту, вы, скорее всего, получите другие результаты.

PNG, к которому вы обращаетесь, не очень большой, при скорости 1 мегабайт в секунду для передачи требуется всего одна пятая секунды. Тем не менее, до начала фактической загрузки ваш компьютер должен выполнить поиск DNS для upload.wikimedia.orgзатем создайте TCP-соединение с серверами Википедии, настройте шифрование с использованием TLS, отправьте запрос на изображение и только после этого начнется фактическая передача изображения. Вполне вероятно, что некоторое время, потраченное на настройку соединения, также учитывается в скорости передачи, измеренной с помощью Curl. Вы получите лучшие результаты, используя большие файлы, но если вы собираетесь часто запускать этот тест скорости, имейте в виду, что Википедии может не понравиться то, что вы теряете их пропускную способность.

Существуют специальные сайты, которые помогут вам измерить скорость вашего провайдера. Просто найдите «http speed test», и вы найдете несколько.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector