2016-05-14 6 views
2

Я пытаюсь использовать 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:

  • После двух дней я пытался изменить свой код обратного вызова, но до сих пор ничего не работает должным образом.

ответ

0

Могу ли я быть уверен, что если запрос был отправлен из потока 1, и запрос B из нити 2 в то же время, а ответы извлекаются на то же время, правильный ответ (ответ A) идет в поток 1 и ответ B на поток 2?

Да, вы можете быть абсолютно уверен в этом.

+0

Хорошо, если да, то какой ответ объясняет поведение программы? – smthidntknwo

+0

Извините, но у меня недостаточно деталей, чтобы это знать. Я знаю, как работает libcurl внутри. –

Смежные вопросы