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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
#1

Как разделить результат, возвращаемый Multi curl? - C++

11.08.2014, 10:52. Просмотров 556. Ответов 7
Метки нет (Все метки)

1)Я вообще непонимаю зачем нужна функция

static int writer(char *data, size_t size, size_t nmemb, string *buffer)

как по мне делает какую-то ерунду.
2) На php курл реализован как-то лучше)) так как результат работы курла возвращает функция curl_exec аналог в с++ curl_easy_setopt который возвращает лишь статус((
ну да ладно вопрос в другом, ниже приведён код с использованием мультикурла, который парсит 5 страниц, и всё пихает в 1 стринг, а мне нужно впихнуть по отдельности в 5 разных строк(ну или массив строк) хз как поделить результат возвращаемый курлом, мб там что-то предусмотренно в данном случае? никто не в курсе?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include "curl.h"
#include "dirent.h"
#pragma comment(lib,"curllib.lib")
#include <iostream>
#include <map>
#include <string>
#include <time.h>
//#include <boost/regex.hpp>
//#include <regex>
using namespace std;
 
 
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;
}
 
 
 
void main()  {
 
    //CURL *curl;
 
    CURL *curls[10];
    CURLM *multi_handle;
 
    CURLcode res;
    string result;
 
    string arr[5] = {"http://mh-proxy.ru/test/1.php?id=1","http://mh-proxy.ru/test/1.php?id=2","http://mh-proxy.ru/test/1.php?id=3","http://mh-proxy.ru/test/1.php?id=4","http://mh-proxy.ru/test/1.php?id=5"};
 
    for (int i = 0; i < 5; i++)
    {
        curls[i] = curl_easy_init();
 
 
 
        curl_easy_setopt(curls[i], CURLOPT_URL,  arr[i].c_str());
        curl_easy_setopt(curls[i], CURLOPT_HEADER, 0);
        curl_easy_setopt(curls[i], CURLOPT_SSL_VERIFYPEER, 0);
        curl_easy_setopt(curls[i], CURLOPT_SSL_VERIFYHOST, 0);
        curl_easy_setopt(curls[i], CURLOPT_USERAGENT, "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.8.131 Version/11.10");
        //указываем функцию обратного вызова для записи получаемых данных
        curl_easy_setopt(curls[i], CURLOPT_WRITEFUNCTION, writer);
        //указываем куда записывать принимаемые данные
        curl_easy_setopt(curls[i], CURLOPT_WRITEDATA, &result);
        //res = curl_easy_perform(curl);
        //curl_easy_cleanup(curl);
 
    }
 
 
    multi_handle = curl_multi_init();
 
    for (int i=0; i<5; i++){
        curl_multi_add_handle(multi_handle, curls[i]);
    }
    CURLMsg *msg;
    int still_running;
    int msgs_left;
 
    do
    {
        curl_multi_perform(multi_handle, &still_running);
    } while(still_running > 0);
     
 
curl_multi_cleanup(multi_handle);
 
  for (int i=0; i<5; i++)
      curl_easy_cleanup(curls[i]);
 
 
 
  cout<<result;
    system("pause");
}
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.08.2014, 10:52     Как разделить результат, возвращаемый Multi curl?
Посмотрите здесь:
C++ Задачу создать 2-мя способами:1) передавать результат работы подпрограммы через результат, возвращаемый функци
C++ Старик Хоттабыч, хочу, что бы результат возвращаемый функцией не стакался...
что за возвращаемый тип, и как работает функция? C++
C++ Разделить элементы одного массива на элементы другого массива, записать результат в третий массив
C++ Возвращаемый тип по умолчанию
C++ Функции, возвращаемый тип
C++ Возвращаемый объект разрушается
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
11.08.2014, 10:58     Как разделить результат, возвращаемый Multi curl? #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от mh-coder Посмотреть сообщение
как по мне делает какую-то ерунду.
Код прокомментирован, все логично. Есть конкретные вопросы?

Цитата Сообщение от mh-coder Посмотреть сообщение
мне нужно впихнуть по отдельности в 5 разных строк
В 57 строке устанавливается аргумент, передаваемый во writer. Меняем строку на массив строк, параметром WRITEDATA устанавливаем i-тую строку, профит.
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
11.08.2014, 13:19  [ТС]     Как разделить результат, возвращаемый Multi curl? #3
а еще вопрос, мне например в массиве нужно постоянно менять количество урлов передаваемых в курл, поэтомц номно использоваит динамику
C++
1
CURL *curls = new CURL[5];
чё он пишет ошибку по поводу того что нельзя использовать массив из войдов?
почему так можно
C++
1
 CURL *curls[10];
а так
C++
1
CURL *curls = new CURL[5];
нельзя?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
11.08.2014, 13:33     Как разделить результат, возвращаемый Multi curl? #4
Потому что Curl - синоним void.
Выделить память для N воидов нельзя, поскольку неизвестен их размер. Можно для указателей.
C++
1
2
3
4
5
6
typedef void Curl;
 
int main() {
    Curl* a[10];
    Curl** curls = new Curl*[5];
}
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
11.08.2014, 16:55  [ТС]     Как разделить результат, возвращаемый Multi curl? #5
а, подскажите, почему код в первом посте жрёт очень много проца, разница между этим мульти курлом который например будет парсить 1 страницу, и обычны курлом котой будет парситть 1 страницу слишком большая.
и еще, я пытался проверить дебагером, он у меня вечно останавливается на цикле

C++
1
2
3
4
do
    {
        curl_multi_perform(multi_handle, &still_running);
    } while(still_running > 0);
который почему-то работает вечно, хотя если без дебагера, то код не зацыкливается и нормально роботает, может быть я не так что-то написал и в нём проблема?
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,013
11.08.2014, 17:12     Как разделить результат, возвращаемый Multi curl? #6
Цитата Сообщение от mh-coder Посмотреть сообщение
код в первом посте жрёт очень много проца
Логично - долбимся же в бесконечном цикле.
См примеры, особое внимание на вызов select и комментарии около него http://curl.haxx.se/libcurl/c/multi-app.html
mh-coder
24 / 23 / 3
Регистрация: 01.02.2014
Сообщений: 770
11.08.2014, 18:01  [ТС]     Как разделить результат, возвращаемый Multi curl? #7
а что надо сделать чтобы был не вечный? я впринципи совсем не понимаю смысл той кучи кода в цикле, а уж темболее смысла того коментария,
его перевод

C++ (Qt)
1
В реальной программе вы КОНЕЧНО проверить код возврата ******* вызывает функцию. В случае успеха, значение maxfd гарантированно будет ******* больше или равно -1. Мы называем выберите (maxfd + 1, ...), особенно в ******* случай (maxfd == -1), мы называем выберите (0, ...), который является в основном равны ******* спать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.08.2014, 20:16     Как разделить результат, возвращаемый Multi curl?
Еще ссылки по теме:
Непонятный возвращаемый тип C++
Ссылка на объект, возвращаемый функцией C++
Перегрузка оператора - возвращаемый тип C++
C++ Перегруженные функции. Возвращаемый тип
Возвращаемый массив содержит мусор C++

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

Или воспользуйтесь поиском по форуму:
DrOffset
7060 / 4201 / 949
Регистрация: 30.01.2014
Сообщений: 6,968
11.08.2014, 20:16     Как разделить результат, возвращаемый Multi curl? #8
Цитата Сообщение от mh-coder Посмотреть сообщение
я впринципи совсем не понимаю смысл той кучи кода в цикле, а уж темболее смысла того коментария
Ну переводить надо не так Гугл тебе напереводит пожалуй
/* In a real-world program you OF COURSE check the return code of the
function calls. On success, the value of maxfd is guaranteed to be
greater or equal than -1. We call select(maxfd + 1, ...), specially in
case of (maxfd == -1), we call select(0, ...), which is basically equal
to sleep. */


/* В реальной программе вы КОНЕЧНО проверите код, который возвращает функция
(имеется в виду функция curl_multi_fdset).
В случае успеха (опять же функции curl_multi_fdset),
значение maxfd гарантированно будет больше, либо равно -1.
Мы вызываем select(maxfd + 1), в особом случае при (maxfd == -1), мы вызываем
select(0, ...), что в целом соответствует вызову sleep.
*/
А вообще вот почитай про select сперва. На русском.
Yandex
Объявления
11.08.2014, 20:16     Как разделить результат, возвращаемый Multi curl?
Ответ Создать тему
Опции темы

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