2016-05-14 14 views
2

Ich versuche, libcurl mit mehreren Threads zu verwenden. Beim Lesen der documentation, habe ich verstanden, die richtige Art und Weise es zu tun ist, eine einzige CURL* Handle für jeden Thread zu verwenden.Verwenden von libcurl erfolglos mit mehreren Threads

Das ist, was ich versuche zu tun: für jeden Thread in einen neuen Griff

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; 
     } 
    } 
} 

diesen Code zusammenfassend kann ich sagen, ich arbeite. Es macht die Anfrage an meine localhost und, nachdem die Post Anfrage durchgeführt wird, mit einem Callback Ich speichere den Inhalt zu einem std::string. Nach allem überprüfe ich, ob die Webseite einige Kennungen für in/corrected id/key enthält. Genau, die Seite druckt das aus:

id or key is not correct 

wenn die ID/Schlüssel nicht korrekt ist. Dies ist, wie ich die Methode nennen KeyIsValid():

if (KeyIsValid(currentKey)) 
     { 
      std::cout << "key tested with success -> " << currentKey << '\n'; 
      return 1; // 1 = success 
     } 

aber während ich alle Schlüssel in einem Array gespeichert überprüfen (1 gespeicherten Schlüssel im Array gleich zu 1 neuen Thread), erhalte ich einige „Fehlinterpretationen“:

key tested with success -> abc 
key tested with success -> hello 
key tested with success -> hello 
key tested with success -> hello 

während der einzige richtige Schlüssel ist nur abc. Ich bin mir nicht sicher, warum das Programm den richtigen Schlüssel abc gefolgt von den anderen falschen Schlüsseln druckt. Aber wenn ich die Elemente des Arrays in nur zwei Elemente (abc und hello, und so mit zwei Threads) ändern, scheint alles ordnungsgemäß zu funktionieren, da ich nur den abc Schlüssel gedruckt bekomme.

ich einige Recherchen im Internet haben, dann ist dies what I found:

Ich habe eine Frage in Bezug auf die Sicherheit von parallel HTTP-Anforderungen durchgeführt wird unter Verwendung von libcurl (C++). Bitte beachten Sie beim Lesen dieser Frage, dass ich nur begrenzte Kenntnisse über HTTP-Anfragen habe. Nehmen wir an, ich habe zwei (oder mehr) Threads, jeder Thread erstellt einmal pro Sekunde eine HTTP-Anfrage. (Alle Anfragen werden an denselben Server gesendet). Wie verfolgt mein Programm (oder etwas anderes?), Welche HTTP-Antwort zu welchem ​​Profil gehört? Ich meine, kann ich sicher sein, dass, wenn Anfrage A von Thread 1 gesendet wurde und B gleichzeitig von Thread 2 angefordert wurde und die Antworten zur selben Zeit abgerufen wurden, die korrekte Antwort (Antwort A) zu Thread 1 und geht Antwort B auf Thread 2? Bitte entschuldigen Sie meine Unwissenheit in dieser Angelegenheit. Vielen Dank.

dieser Typ nur ist meine gleiche Frage ohne präziser zu sein (er keinen Code zeigte).

Ich werde genau das fragen:

Kann ich sicher sein, dass, wenn Anfrage A vom Faden 1 und Anforderung B aus Faden 2 zur gleichen Zeit gesendet wurde, und die Antworten retrived an gleichzeitig geht die richtige Antwort (Antwort A) auf Thread 1 und Antwort B auf Thread 2?

mit Bezug auf meinen Code. Vielleicht analysiere ich die Seite falsch, ich weiß es nicht.

Entschuldigung für meine Unwissenheit in dieser Angelegenheit.

Edit:

  • Nach zwei Tagen habe ich versucht, meinen Rückruf-Code zu ändern, aber immer noch richtig funktioniert nichts.

Antwort

0

Kann ich sicher sein, dass, wenn Anfrage A vom Faden 1 und Anforderung B vom Gewinde 2 zur gleichen Zeit gesendet wurde, und die Antworten auf den gleichzeitig abgerufen werden, ist die korrekte Antwort (response A) geht zu Thread 1 und Antwort B zu Thread 2?

Ja können Sie absolut sicher davon sein.

+0

Okay, wenn ja, welche Antwort würde das Verhalten des Programms erklären? – smthidntknwo

+0

Sorry, aber ich habe nicht genug Details, um das zu wissen. Ich weiß aber, wie libcurl intern funktioniert. –

Verwandte Themen