我想正确重用卷曲处理,所以它不会给我的错误和功能正常。
假设我有这段代码:
CURL *curl;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/5.0...");
curl_easy_setopt(curl, CURLOPT_URL, "http://www.google.com");
curl_easy_perform(curl);
curl_easy_setopt(curl, CURLOPT_URL, "http://www.bbc.com");
curl_easy_perform(curl);
curl_easy_cleanup(curl);
curl_global_cleanup();
这将是重用卷曲处理的好还是正确的方式? 或者我需要使用curl_easy_reset()
上处理?
我还希望,如果有人建议你应该避免卷曲做什么。 也许有人可以给我一个链接到一个已经存在的信息源?
当您使用简单的界面对环境的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's 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's wrong with 'result'*/
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(result));
return 1;
}
}
/* if something's 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;
}
如果你想重新使用手柄完全不同的目的,你最好使用不同的卷曲容易把手。 还是你的代码应该工作正常,但因为它显然两个不同的操作我会用不同的句柄。
然而有时你需要用相同的处理工作,如果你不想做重置自动,使用相应的功能:
void curl_easy_reset(CURL *handle);
请注意,它不会改变活动连接,会话ID缓存,DNS缓存,从手柄的饼干和股份。
我还没有尝试过,但你的代码也应该给我们类似的东西:
#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
或用5替换5000。
如果我理解正确的问题,你想知道,如果你可以拨打电话到curl_easy_perform()
然后只能通过更改URL curl_easy_setoption()
然后拨打第二个电话? 这应该没有任何错误,因为该功能不会更改处理任何以前设置的选项。 这是一个简短的工作示例:
size_t writeCallback(char* contents, size_t size, size_t nmemb, std::string* buffer) {
size_t realsize = size * nmemb;
if(buffer == NULL) {
return 0;
}
buffer->append(contents, realsize);
return realsize;
}
int main(int argc, char** argv) {
std::string buffer;
// initialize global
curl_global_init(CURL_GLOBAL_ALL);
// start a libcurl easy session
CURL* ch = curl_easy_init();
// this options will only be set once
curl_easy_setopt(ch, CURLOPT_VERBOSE, 0);
curl_easy_setopt(ch, CURLOPT_FOLLOWLOCATION, 1);
curl_easy_setopt(ch, CURLOPT_USERAGENT, "Crawler");
curl_easy_setopt(ch, CURLOPT_WRITEFUNCTION, &writeCallback);
curl_easy_setopt(ch, CURLOPT_WRITEDATA, &buffer);
std::vector<const char*> queue;
queue.push_back("http://www.google.com");
queue.push_back("http://www.stackoverflow.com");
const char* url;
CURLcode code;
do {
// grab an url from the queue
url = queue.back();
queue.pop_back();
// only change this option for the handle
// the rest will stay intact
curl_easy_setopt(ch, CURLOPT_URL, url);
// perform transfer
code = curl_easy_perform(ch);
// check if everything went fine
if(code != CURLE_OK) {
}
// clear the buffer
buffer.clear();
} while(queue.size() > 0);
// cleanup
curl_easy_cleanup(ch);
curl_global_cleanup();
return 0;
}
或者,我需要对处理使用curl_easy_reset()?
答案是否定的,因为curl_easy_perform()
不将重置任何选项的代码应该是很好,你可以只改变URL状柱curl_easy_setoption(curl, CURLOPT_URL, <newurl>);
。
或者,我需要对处理使用curl_easy_reset()?
你要么重置XOR把它清理干净(分配的返回值前curl_easy_init()
再次) -这两项工作是不好的。 欲了解更多信息,请参阅该文档 。