Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
featZima
Сообщений: n/a
#1

libcurl and HTTP-Pipeling - C++

18.04.2010, 17:32. Просмотров 1234. Ответов 1
Метки нет (Все метки)

Использую libcurl для запроса размера картинок через HTTP HEAD (> 100 картинок за 1 заход)... хочется использовать технологию Http-Pipeling для ускорения получения информации, но либо libcurl как то неправильно понимает смысл технологии, либо я не понимаю как правильно задать необходимые параметры...

В результате работы нижеприведённого исходника, программа делает 100 HEAD запросов через 1 tcp соединение, но по схеме запрос-ответ-запрос-ответ-запрос...
http://img-fotki.yandex.ru/get/9/fea...7e044_orig.jpg

Для проверки работоспособности технологии написал пример на WinAPI, там всё работает как часики: запрос-запрос-запрос...-ответ-ответ-ответ... В результате время сокращается в 10 раз.
http://img-fotki.yandex.ru/get/4209/...87b33_orig.jpg

Хочется услышать возможные предложения по решению проблемы — заранее спасибо за ответы...

Код
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <curl/curl.h>
#include <curl/types.h>
#include <curl/easy.h>

#define MAIN_LOOP_HANG_TIMEOUT     90 * 1000
#define MULTI_PERFORM_HANG_TIMEOUT 60 * 1000
#define TEST_ERR_MAJOR_BAD -1

#define NUM_HANDLES 100

using namespace std;
static string buffer;

static int writer(char *data, size_t size, size_t nmemb, string *buffer)
{
  //переменная - результат, по умолчанию нулевая
  int result = 0;
  //проверяем буфер
  if (buffer != NULL)
  {
    //добавляем к буферу строки из data, в количестве nmemb
    buffer->append(data, size * nmemb);
    //вычисляем объем принятых данных
    result = size * nmemb;
  }
  //вовзращаем результат
  return result;
}

int main()
{
  getchar();

  char URL[] = "http://img-kiev.fotki.yandex.ru/get/3911/featzima.2e/0_32611_94e128a9_orig";
  int res = 0;
  CURL *curl[NUM_HANDLES];
  int running;
  char done=FALSE;
  CURLM *m;
  int i, j;
  struct timeval ml_start;
  struct timeval mp_start;
  char ml_timedout = FALSE;
  char mp_timedout = FALSE;

  if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK) {
    fprintf(stderr, "curl_global_init() failed\n");
    return TEST_ERR_MAJOR_BAD;
  }

  if ((m = curl_multi_init()) == NULL) {
    fprintf(stderr, "curl_multi_init() failed\n");
    curl_global_cleanup();
    return TEST_ERR_MAJOR_BAD;
  }

  /* get NUM_HANDLES easy handles */
  for(i=0; i < NUM_HANDLES; i++) {
    curl[i] = curl_easy_init();
    if(!curl[i]) {
     fprintf(stderr, "curl_easy_init() failed on handle #%d\n", i);
    }
    curl_easy_setopt(curl[i], CURLOPT_URL, URL);
    curl_easy_setopt(curl[i], CURLOPT_VERBOSE, 0);
    curl_easy_setopt(curl[i], CURLOPT_HEADER, 1);
    curl_easy_setopt(curl[i], CURLOPT_NOBODY, 1);

    curl_easy_setopt(curl[i], CURLOPT_WRITEFUNCTION, writer);
    curl_easy_setopt(curl[i], CURLOPT_WRITEDATA, &buffer);

    struct curl_slist *slist=NULL;
    slist = curl_slist_append(slist, "Connection: keep-alive");
    curl_easy_setopt(curl[i], CURLOPT_HTTPHEADER, slist);
    slist=NULL;

    /* add handle to multi */
    if ((res = (int)curl_multi_add_handle(m, curl[i])) != CURLM_OK) {
      fprintf(stderr, "curl_multi_add_handle() failed, on handle #%d with code %d\n", i, res);
    }
  }


  // ВОТ ТУТ ВКЛЮЧАЕМ ЭТУ ТЕХНОЛОГИЮ
  curl_multi_setopt(m, CURLMOPT_PIPELINING, 1);
  fprintf(stderr, "Start at URL 0\n");
  while (!done) {
    fd_set rd, wr, exc;
    int max_fd;

    while (res == CURLM_CALL_MULTI_PERFORM) {
      res = (int)curl_multi_perform(m, &running);

      if (running <= 0) {
        done = TRUE; /* bail out */
        break;
      }
    }
    if (mp_timedout || done)
      break;

    if (res != CURLM_OK) {
      fprintf(stderr, "not okay???\n");
      break;
    }

    FD_ZERO(&rd);
    FD_ZERO(&wr);
    FD_ZERO(&exc);
    max_fd = 0;

    if (curl_multi_fdset(m, &rd, &wr, &exc, &max_fd) != CURLM_OK) {
      fprintf(stderr, "unexpected failured of fdset.\n");
      res = 189;
      break;
    }

    res = CURLM_CALL_MULTI_PERFORM;
  }

  /* cleanup NUM_HANDLES easy handles */
  for(i=0; i < NUM_HANDLES; i++) {
    curl_multi_remove_handle(m, curl[i]);
    curl_easy_cleanup(curl[i]);
  }

  curl_multi_cleanup(m);
  curl_global_cleanup();

  return res;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.04.2010, 17:32     libcurl and HTTP-Pipeling
Посмотрите здесь:

Libcurl + QT Creator - Какую версию libcurl качать для Windows - C++
Пытаюсь подружить Curl и QT Creator Подскажите пожалуйста какую версию libcurl качать для Windows и как вообще их подружить :) ...

Замена libcurl - C++ Builder
Всем привет. И всех с 1 маем. У меня вопрос, ребята подскажите чем можно заменить библиотеку libcurl? Всего два критерия: 1: Могла...

Трабла с LibCurl - C++
#include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;time.h&gt; #include &lt;curl/curl.h&gt; ...

Помогите установить libcurl - Visual C++
Как я делал. 1)Скачал отсюда http://curl.haxx.se/download.html 2)Скомпилировал. 3)Засунул в папку с проектом libcurl.lib 4)Добавил...

Как ускорить libcurl - C++ Linux
Загружаю страницу с помощью curl двумя способами: libcurl system(&quot;curl&quot;) Код первого способа: /** Коллбэк функция для...

libcurl и POST запрос - C++ Linux
Непонятная ошибка передачи POST данных Пишу Qt4 клиент, который запрашивает данные с помощью XML XML передаю POST запросом в...

Не получается использовать libcurl - C++
Скинул include файлы в include папку visual studio, lib файлы в lib папку, dll-ки в папку system32 windows. Вот тестовый пример, но...

libcUrl с OpenSSL на MinGW - C++
Помогите! Никак не могу разобраться с libcUrl с OpenSSL, просто libcUrl компилю без проблем, и использую, но нужнен https. ...

Использование библиотеки libcurl - Visual C++
Доброго времени суток, товарищи, никак не могу использовать библиотеку libcurl.... рассказываю, как делал: 1. качаю с оф сайте для...

Подключение библиотеки libcurl - C++
Всем привет. Решил поработать с библиотекой libcurl. Скачал архив, распаковал на рабочий стол. Не пойму что делать дальше. В интернете в...

libcurl: закачка файла - C++
Файл скачивается, но его размер 12243 байт, хотя должен быть 12182 байт, и так с любым файлом, получается чуть большего размера, что не...

Libcurl, проверка авторизации - C++
Не судите строго, это первое, что я пытаюсь написать на c++ Добавил некую кнопку, при нажатии которой. Должна исполняться функция. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Azimuth
0 / 0 / 0
Регистрация: 12.02.2014
Сообщений: 10
28.10.2014, 17:46     libcurl and HTTP-Pipeling #2
Вам удалось решить проблему за 4 года?
Yandex
Объявления
28.10.2014, 17:46     libcurl and HTTP-Pipeling
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru