如果我正确理解了这个问题,您想知道是否可以致电curl_easy_perform() https://curl.haxx.se/libcurl/c/curl_easy_perform.html然后只通过更改urlcurl_easy_setopt() https://curl.haxx.se/libcurl/c/curl_easy_setopt.html然后再打第二个电话?这应该不会出现任何错误,因为该函数不会更改句柄的任何先前设置的选项。这是一个简短的工作示例:
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();
if (!ch) {
// Something went wrong
curl_global_cleanup();
return -1;
}
// These 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);
// Push a couple of URLs onto queue.
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 the CURLOPT_URL 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) {
// Handle any errors.
}
// Clear the buffer.
buffer.clear();
} while (queue.size() > 0);
// Cleanup.
curl_easy_cleanup(ch);
curl_global_cleanup();
return 0;
}
或者我是否需要在该句柄上使用curl_easy_reset()?
答案是no since curl_easy_perform() https://curl.haxx.se/libcurl/c/curl_easy_perform.html不会重置任何选项,您的代码应该没问题,您可以坚持只更改网址,例如curl_easy_setoption(curl, CURLOPT_URL, <newurl>);
.