Я пытаюсь использовать libcurl с несколькими потоками. Читая documentation, я понял, что правильный способ сделать это - использовать один дескриптор CURL*
для каждого потока.Использование libcurl безуспешно с несколькими потоками
Это то, что я пытаюсь сделать:
static size_t WriteCallback(void *contents, size_t size, size_t nmemb, void *userp)
{
((std::string*)userp)->append((char*)contents, size * nmemb);
return size * nmemb;
}
bool KeyIsValid(std::string keytocheck) {
CURL *curl;
CURLcode res;
std::string content;
curl = curl_easy_init();
if (curl) {
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/mypage.php");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, ("something=hello&somethingtwo=" + keytocheck).c_str());
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
// std::cout << content << std::endl;
if (content.find("id or key is not correct") == std::string::npos) // if i use an != the correct key (abc) doesn't get printed
{
return false;
}
else {
return true;
}
}
}
Обобщая этот код, я могу сказать, что я работаю в новой ручке для каждого потока. Он делает запрос к моему localhost и после выполнения запроса на отправку с использованием обратного вызова я сохраняю содержимое до std::string
. После всего, что я проверяю, содержит ли веб-страницу некоторые идентификаторы для/исправленного идентификатора/ключа. Именно на этой странице распечатывается эта информация:
id or key is not correct
, когда неверный идентификатор /. Это, как я вызываю метод KeyIsValid()
:
if (KeyIsValid(currentKey))
{
std::cout << "key tested with success -> " << currentKey << '\n';
return 1; // 1 = success
}
, но пока я проверяю каждый ключ, хранящийся в массиве (1 хранится ключ в массиве равно 1 новый поток), я получаю некоторые «кривотолков»:
key tested with success -> abc
key tested with success -> hello
key tested with success -> hello
key tested with success -> hello
, в то время как единственная правильная клавиша - только abc
. Я не уверен, почему программа печатает правильный ключ abc
, за которым следуют другие неправильные ключи. Но если я изменю элементы массива только на два элемента (и hello
, и поэтому, используя два потока), все работает нормально, поскольку я печатаю только ключ abc
.
Я сделал некоторые поиски в Интернете, это what I found:
У меня есть вопрос о безопасности выполнения параллельных HTTP-запросов, используя Libcurl (C++). При чтении этого вопроса, пожалуйста, имейте в виду, что я имею ограниченное знание об HTTP-запросах в целом. В принципе, допустим, у меня есть два (или более) потока, каждый поток делает HTTP-запрос один раз в секунду. (Все запросы сделаны на том же сервере). Как моя программа (или что-то еще?) Отслеживает, какой HTTP-ответ принадлежит протекторам? Я имею в виду, могу ли я быть уверенным, что если запрос A был отправлен из потока 1 и одновременно запросить B из потока 2, и ответы будут возвращены в одно и то же время, правильный ответ (ответ A) будет передаваться в поток 1 и ответ В на поток 2? Пожалуйста, извините мое невежество в этом вопросе. Благодарю.
этот парень просто прошу мой же вопрос , не будучи более конкретным (он не показал какую-либо коду).
Я буду точно спросить:
Могу ли я быть уверен, что если запрос был отправлен из потока 1, и запрос B от нити 2 в то же время, и ответы на retrived в то же время правильный ответ (ответ A) идет в поток 1 и ответ B на поток 2?
со ссылкой на мой код. Возможно, я неправильно анализирую страницу, я не знаю.
Извините за мое невежество в этом вопросе.
Edit:
- После двух дней я пытался изменить свой код обратного вызова, но до сих пор ничего не работает должным образом.
Хорошо, если да, то какой ответ объясняет поведение программы? – smthidntknwo
Извините, но у меня недостаточно деталей, чтобы это знать. Я знаю, как работает libcurl внутри. –