Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.51/37: Рейтинг темы: голосов - 37, средняя оценка - 4.51
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12

C++, Curl и threads-потоки

10.09.2009, 14:10. Показов 7885. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть такой пример у разработчиков CURL:
http://curl.haxx.se/libcurl/c/multithread.html
Суть - в 4 потока одновременно открывается 4 сайта, текст html выводится на экран.
Всё бы ничего, но в примере не используется параметр
C++
1
curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15);
, который необходим, в случае, когда сайт умер и ответа от него нет.
Однако, в этом случае периодически возникает ошибка Segmentation fault и скрипт вылетает.

Объясните, пожалуйста, что это за ошибка такая и как с ней справиться.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.09.2009, 14:10
Ответы с готовыми решениями:

Threads, потоки
Здравствуйте, ребят, помогите решить задачу, не могу понять как все реализовать. Создать класс Flood, который получает в конструкторе...

Потоки демоны (Daemon threads)
Объясните зачем нужны потоки-демоны. В каких случаях они применяются ?

Потоки (threads) и сжатие файлов
Всем привет! Я недавно изучаю C#, пытаюсь самостоятельно выполнять практические задания. Есть задание, общая суть такая:...

8
Эксперт С++
 Аватар для odip
7176 / 3234 / 82
Регистрация: 17.06.2009
Сообщений: 14,164
10.09.2009, 18:07
Телепаты отдыхают !
Весь код приведи.
И где ты это вообще проверяешь - какая ОС хотя бы ?
0
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12
11.09.2009, 08:34  [ТС]
Цитата Сообщение от odip Посмотреть сообщение
Телепаты отдыхают !
Весь код приведи.
И где ты это вообще проверяешь - какая ОС хотя бы ?
Дак хоть бы по ссылке перешел. Код то там.
C++
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
#include <stdio.h>
#include <pthread.h>
#include <curl/curl.h>
 
#define NUMT 20
 
const char * const urls[NUMT] = {
    "http://curl.haxx.se/",
    "ftp://cool.haxx.se/",
    "http://www.contactor.se/",
    "www.haxx.se"
    "http://curl.haxx.se/",
    "ftp://cool.haxx.se/",
    "http://www.contactor.se/",
    "www.haxx.se"
    "http://curl.haxx.se/",
    "ftp://cool.haxx.se/",
    "http://www.contactor.se/",
    "www.haxx.se"
    "http://curl.haxx.se/",
    "ftp://cool.haxx.se/",
    "http://www.contactor.se/",
    "www.haxx.se"
    "http://curl.haxx.se/",
    "ftp://cool.haxx.se/",
    "http://www.contactor.se/",
    "www.haxx.se"
};
 
static void *pull_one_url(void *url)
{
    CURL *curl;
 
    curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, url);
    curl_easy_setopt(curl, CURLOPT_TIMEOUT, 15);
    curl_easy_perform(curl);
    curl_easy_cleanup(curl);
 
    return NULL;
}
 
int main(int argc, char **argv)
{
    pthread_t tid[NUMT];
    int i;
    int error;
 
    curl_global_init(CURL_GLOBAL_ALL);
    for(i=0; i< NUMT; i++) error = pthread_create(&tid[i], NULL, pull_one_url, (void *)urls[i]);
    for(i=0; i< NUMT; i++) error = pthread_join(tid[i], NULL);
 
    return 0;
}
Собирается это всё на дебиане под с++ (в смысле, компилятор)
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2009, 13:13
glob(),
Цитата Сообщение от glob() Посмотреть сообщение
"www.haxx.se"
а после этих строк запятые ставить не нужно?

Добавлено через 12 минут
Ты бы хоть контрольные сообщения вставил для определения статуса curl_easy_perform(curl), и других. В общем, трудись.
0
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12
11.09.2009, 13:17  [ТС]
Нужно. Это я уже тут, на форум когда копировал, не дописал.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
11.09.2009, 13:19
glob(), Ну вот вставь вывод диагностических сообщений, и быстро поймешь в чем причина.
0
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12
14.09.2009, 16:24  [ТС]
Цитата Сообщение от niXman Посмотреть сообщение
glob(), Ну вот вставь вывод диагностических сообщений, и быстро поймешь в чем причина.
А что для этого написать нужно?
0
0 / 0 / 0
Регистрация: 02.09.2009
Сообщений: 12
15.09.2009, 10:27  [ТС]
И вообще в моём коде, основанном на этом примере, в явном виде идет утечка памяти.
Функцию, в которой это происходит я нашел. Но как можно отследить, почему это происходит?
Дело в том, что в явном виде (malloc, new) я переменные не определяю, и не очищаю, соответствено:
C++
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
static int writer(char *data, size_t size, size_t nmemb, std::string *writerData)
{
    if (writerData == NULL) return 0;
    writerData->append(data, size*nmemb);
 
    return size * nmemb;
}
 
void get_page_as_browser(string url, string &buffer, int with_timeout = 15, bool with_cookies = false, bool with_redirects = true, bool convert_utf8 = true)
{
    double st;
    CURL *curl;
    curl = curl_easy_init();
    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_HEADER, 0);
        curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 1L);
        curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 5);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
        curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0);
        curl_easy_setopt(curl, CURLOPT_VERBOSE, 0);
        curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, with_timeout);
        curl_easy_setopt(curl, CURLOPT_TIMEOUT, with_timeout);
        curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
        if (with_redirects) curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true);
        curl_easy_setopt(curl, CURLOPT_USERAGENT, get_random_user_agent());
        curl_easy_setopt(curl, CURLOPT_ENCODING, "");
        curl_easy_setopt(curl, CURLOPT_RANGE, "0-125000"); 
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
        curl_easy_perform(curl);
 
        curl_easy_cleanup(curl);
    }
}
Функция get_page_as_browser(url, html, 25); вызывается в threads в несколько потоков, по окончанию работы данные из buffer сохраняются в файл и вызывается снова. И так до бесконечности.

Перед каждым вызовом get_page_as_browser, буффер очищается так:
C++
1
2
html = "";
html.erase();
Память при работе расходуется очень быстро и, в итоге, заканчивается.
Если закоментировать
C++
1
2
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &buffer);
данные будут выводиться не в буффер, а на экран и никаких потерь не происходит.

Вероятно косяк в функции static int writer, но как это отследить, не понимаю.
Подскажите, пожалуйста.
0
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
17.09.2009, 20:07
Цитата Сообщение от glob() Посмотреть сообщение
std::string *writerData
это у тебя объект типа std::string. после получения страницы, вызывай std::string.clear()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.09.2009, 20:07
Помогаю со студенческими работами здесь

Сокеты (WinSock 2.0) и потоки (Threads) в WinXP Pro и WinServ 2003
Введение Пишу &quot;клиент-серверное&quot; приложение, чтобы руку &quot;набить&quot; (TCP/IP, не UDP). При подключении клиента для него выделяется поток, при...

Threads Потоки синхронизация, один producer два consumer`a и очередь
Привет. Только начал в шарпы, не говоря уже про потоки и мне тут такую задачку дали Итак дано: один produser два consumer`a. ...

Авторизация curl (различие между curl и ajax запросами)
Есть ли различие в передаче данных в json формате через curl и ajax? Я хочу написать запрос, который будет авторизировать пользователя на...

Curl команду превратить в php curl
команда: curl -s -F widget=$WIDGET -F secret=$SECRET -F amouser=$AMOUSER -F amohash=$AMOHASH -F domain=amocrm.ru -F widget=@$file...

Curl not a valid cUrl на windows
Есть такая функция. private function curl_send($url) { ob_start(); $ch = curl_init($url); curl_exec($ch); curl_close($ch); ...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru