Ответ 1
Когда вы используете среду libcurl на простом интерфейсе, вам сначала нужно позвонить:
-
curl_easy_init()
, которые инициализируют простой дескриптор, -
curl_global_init()
, в большинстве случаев опция флага должна бытьCURL_GLOBAL_ALL
Каждая из этих двух функций называется только один раз в начале и нуждается в их противоположной очистке:
-
curl_easy_cleanup()
, когда вы закончили дескрипторы, которые вы объявили, -
curl_global_cleanup()
, когда вы закончите с libcurl,
Для получения более точных результатов проверьте ошибки как можно больше. Libcurl предоставляет для этого функцию curl_easy_strerror()
. Он возвращает строку, описывающую ошибку CURLcode. Кроме того, некоторые функции возвращают значение
CURL_OK или определенное целое число, если все в порядке.
Например, здесь можно использовать опцию CURLOPT_URL:
#include <curl.h>
int main(void)
{
/* declaration of an object CURL */
CURL *handle;
/* result of the whole process */
CURLcode result;
/* the first functions */
/* set up the program environment that libcurl needs */
curl_global_init(CURL_GLOBAL_ALL);
/* curl_easy_init() returns a CURL easy handle that you're gonna reuse in other easy functions*/
handle = curl_easy_init();
/* if everything all right with the easy handle... */
if(handle)
{
/* ...you can list the easy functions */
/* here we just gonna try to get the source code of http://example.com */
curl_easy_setopt(handle, CURLOPT_URL, "http://example.com");
/* but in that case we also tell libcurl to follow redirection */
curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
/* perform, then store the expected code in 'result'*/
result = curl_easy_perform(handle);
/* Check for errors */
if(result != CURLE_OK)
{
/* if errors have occured, tell us wath wrong with 'result'*/
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result));
return 1;
}
}
/* if something gone wrong with curl at the beginning, we'll appriciate that piece of code */
else
{
fprintf(stderr, "Curl init failed!\n");
return 1;
}
/* cleanup since you've used curl_easy_init */
curl_easy_cleanup(handle);
/* this function releases resources acquired by curl_global_init() */
curl_global_cleanup();
/* make the programme stopping for avoiding the console closing befor you can see anything */
system("PAUSE");
return 0;
}
Если вы хотите повторно использовать этот дескриптор для совершенно другой цели, вам лучше использовать разные CURL легкие ручки. Тем не менее, ваш код должен работать нормально, но я бы использовал разные ручки, потому что это, очевидно, две отдельные операции.
Однако иногда вам нужно работать с одним и тем же дескриптором, и если вы не хотите автоматически делать reset, используйте соответствующую функцию:
void curl_easy_reset(CURL *handle);
Обратите внимание, что он не изменяет живые подключения, кеш идентификатора сеанса, кеш DNS, файлы cookie и общие ресурсы из дескриптора.
Я не пробовал, но с вашим кодом он должен дать нам что-то вроде этого:
#include <curl.h>
int main(void)
{
CURL *handle;
CURLcode result;
int error = 0;
int error2 = 0;
curl_global_init(CURL_GLOBAL_ALL);
handle = curl_easy_init();
if(handle)
{
curl_easy_setopt(handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6");
curl_easy_setopt(handle, CURLOPT_URL, "http://www.google.com");
result = curl_easy_perform(handle);
if(result != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result));
error++;
}
Sleep(5000); // make a pause if you working on console application
curl_easy_reset(handle);
curl_easy_setopt(handle, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 6.1; fr; rv:1.9.2) Gecko/20100115 Firefox/3.6"); // have to write it again
curl_easy_setopt(handle, CURLOPT_URL, "http://www.bbc.com");
result = curl_easy_perform(handle);
if(result != CURLE_OK)
{
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result));
error2++;
}
if(error == 1 || error2 == 1)
{
return 1;
}
}
else
{
fprintf(stderr, "Curl init failed!\n");
return 1;
}
curl_easy_cleanup(handle);
curl_global_cleanup();
system("PAUSE");
return 0;
}
Если у вас возникли проблемы с Sleep
, попробуйте заменить его на Sleep
или _sleep
или заменить 5000 на 5.