Stringübergabe an Kette geht nicht?



  • Hi! Habe einen String deklariert mit:

    string pwd="hi";

    und möchte ihn hier einsetzen:

    curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, "j_username=eggersson&j_password="+pwd);
    

    alles kompiliert fehlerfrei, aber zur laufzeit schmiert das programm ab und es kommt dieser Problembericht senden quatsch 😉

    an was kann das liegen?
    mfg



  • Schwer zu sagen bei so wenig Informationen.

    Führe das Programm doch mal im Debugger aus.


  • Administrator

    Also wenn du meinst, dass das folgende das Problem ist, kann ich dir versichern, dass es dies nicht ist.

    void foo(std::string const& str)
    {
    }
    
    // ...
    std::string pwd = "hi";
    foo("Test" + pwd); // <- Erzeugt kein Fehler!
    

    Dein Problem liegt irgendwo anders. Debugge mal oder liefere mehr Informationen. Probiere einen kleineren Code herzustellen, wo der Fehler immer noch auftritt. Das hilft womöglich dir selber oder du kannst diesen dann hier reinstellen.

    Grüssli



  • Also das einzige was helfen könnte ist, wenn ich euch mal den ganzen code Poste:

    #include <iostream>
    #include <curl/curl.h>
    #include <curl/easy.h>
    #include <string>
    using namespace std; 
    
    CURL *easyhandle; //global. Speicher wird gleich vor Programmstart festgelegt und nicht zur Runtime.
    CURLcode res;
    
    int curl_writeCallback(char *inBuffer, size_t size, size_t nmemb, string *outBuffer)
    {
    	outBuffer->append(inBuffer);
    	return size*nmemb; 
    }
    
    int main(void)
    {
    	//handle initialisieren
        easyhandle=curl_easy_init();
    	string data;
        string pwd="hi";
    
    	if(!easyhandle)
    	{
    		cout<<"curl handle not started! ERROR!\n";
    	}
    	else cout<<"curl handle started!\n";
    
        //definieren
    	curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, "j_username=eggersson&j_password="+pwd);
    	curl_easy_setopt(easyhandle, CURLOPT_URL, "http://lala.de/j_security_check");
    	curl_easy_setopt(easyhandle, CURLOPT_WRITEFUNCTION, curl_writeCallback);
        curl_easy_setopt(easyhandle, CURLOPT_WRITEDATA    , &data);
    
    	//abschicken
    	res=curl_easy_perform(easyhandle);
    	if(CURLE_OK==res)
    	{
    		cout<<"connection established\n";
    	}
    	else
    	{
    		cout<<"something went wrong!\n";
    	}
    
    	if(data=="")
    	{
    		cout<<"PW FOUND!!!\n";
    	} 
    	else
    	{
    		cout<<data;
    		cout<<"no pw, sorry!\n";	
    	}
    
    	curl_easy_cleanup(easyhandle); 
    
        return 1;
    }
    


  • also ich hab jetzt wirklich ne ganze menge ausprobiert, aber bekomme das einfach nicht gebacken. Vielleicht hilft die Info dass der String an einen Pointer übergeben wird?



  • so habe jetzt mal bisschen weiter geforscht.
    Auf jeden Fall sagt mir der Compiler, dass man nicht zwei Pointer addieren kann. Dabei will ich ja nur an den String (was ein char Pointer Array ist) weitere Zeichen hinzufügen. Merkwürdig...
    jemand eine Idee.




  • Administrator

    Kannst du uns sagen, von welchem Typ der dritte Parameter bei curl_easy_setopt ist? Womöglich ein char const* ? Dann suchst du womöglich sowas?

    curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS, ("j_username=eggersson&j_password=" + pwd).c_str());
    

    http://www.cplusplus.com/reference/string/string/c_str.html

    Wobei ich allerdings nicht weiss, ob die Funktion den String kopieren wird, oder verlangt, dass der Speicher vorhanden bleibt. Im zweiteren Fall, wäre das fatal.

    Grüssli

    PS: Wenn der Compiler eine Fehlermeldung wirft, zeigt sie uns doch bitte. Es ist mühsam, wenn man raten muss 😉



  • Hi!

    Vielen Dank für die Tips, kann ich so auch ohne Probleme kompilieren.

    also: "bla"+string(pwd);

    das geht schon, aber wenn ich das Programm starte stürzt es wieder ab. Hab jetzt den Debugger drüberlaufen lassen, mit dem ich mich leider nicht so gut auskenne, aber auf jeden fall sagt mir ein Fenster: "unbehandelte Ausnahme in nochmalCurl.exe (LIBCURL.DLL): 0x0000005: Access Violation."

    Heißt das, dass meine Lib im Eimer ist/fehlerhaft ist. Oder dass ich einfach auf einen Speicher über eine Variable zugreife, was die Libcurl nicht mag???

    Grüße



  • howdyman schrieb:

    Hi!

    Vielen Dank für die Tips, kann ich so auch ohne Probleme kompilieren.

    also: "bla"+string(pwd);

    das geht schon, aber wenn ich das Programm starte stürzt es wieder ab. Hab jetzt den Debugger drüberlaufen lassen, mit dem ich mich leider nicht so gut auskenne, aber auf jeden fall sagt mir ein Fenster: "unbehandelte Ausnahme in nochmalCurl.exe (LIBCURL.DLL): 0x0000005: Access Violation."

    Heißt das, dass meine Lib im Eimer ist/fehlerhaft ist. Oder dass ich einfach auf einen Speicher über eine Variable zugreife, was die Libcurl nicht mag???

    Grüße

    Jo, weil du einen temporären string erstellst, und einen Zeiger auf den Anfang übergibst. Das ist das Problem. Mach den string ausserhalb und setze ihn zusammen, wie du willst und dann mache in der Funktion drin als übergabe .c_str().



  • Ok danke, das funktioniert, aber wenn ich mein username und passwort aus einer Datei auslese, scheint das nicht zu funktionieren. Hier meine Funktion zum Erstellen des Strings:

    string retusrpwd()
    {
    	pwd=fgets(Puffer,260,Wordlist);
    	usrpwd="j_username=eggersson&j_password="+string(pwd);
    	cout<<usrpwd.c_str();
    	return usrpwd;
    }
    

    und hier übergebe ich das ganze:

    curl_easy_setopt(easyhandle, CURLOPT_POSTFIELDS,retusrpwd().c_str());
    

    wenn ich in obiger Funktion statt:

    pwd=fgets(Puffer,260,Wordlist);
    

    folgendes mache:

    pwd="meinpw";//fgets(Puffer,260,meinepwdatei);
    

    dann funktioniert das wunderbar und mein
    Programm sagt mir auch, dass der login korrekt war.
    Wenn ichs aus einer Datei auslese scheint da was nicht zu gehen,
    denn mein Programm sagt mir, dass das PW falsch ist.

    An was liegt das?



  • immer noch aktuell. keien Lösung gefunden. kann es sein, dass c_str() aus meinem string was andres bastelt??


  • Administrator

    Da hast du dein Problem:
    http://curl.haxx.se/libcurl/c/curl_easy_setopt.html#CURLOPTPOSTFIELDS

    Die Daten müssen aufbewahrt werden, bis curl diese nicht mehr benötigt. Wieso das eine ging und das andere nicht, könnte ein reiner Zufall sein, denn du löst hier undefiniertes Verhalten aus. Der Speicher, auf welcher zugegriffen wird, wurde gelöscht. Du musst den Speicher also erhalten, bis curl diesen nicht mehr benötigt.

    Grüssli

    PS: Wieso benutzt du nicht die C++ Filestreams?



  • Das heißt also ich muss schon vor dem Programmstart den Speicher für Curl festlegen?

    Was wäre der Unterschied zu Filestreams? (habe damit noch nie gearbeitet).
    Wie könnten sie mein Problem lösen?

    Grüße


  • Administrator

    howdyman schrieb:

    Das heißt also ich muss schon vor dem Programmstart den Speicher für Curl festlegen?

    Nein, du musst einfach den Speicher aufbewahren, bis du den Transfer erledigt hast. Steht alles in der Dokumentation. Lies zum Beispiel mal den Link, den ich dazugefügt habe.

    howdyman schrieb:

    Was wäre der Unterschied zu Filestreams? (habe damit noch nie gearbeitet).
    Wie könnten sie mein Problem lösen?

    Dein Problem können diese nicht lösen. Nur ist es üblich, dass man in C++ mit C++ programmiert und in C mit C. Du vermischst hier C und C++ und davon rattet man ab, da es zu Fehlern führen kann. Wenn du noch nie mit Filestreams gearbeitet hast, dann solltest du vielleicht mal ein sinnvolles Tutorial zu C++ durchmachen oder aber gleich ein Buch kaufen, welches dir eine gute Einführung gibt. Als Bücher wären hier wohl vor allem den C++ Primer und Thinking in C++ 1&2 zu nennen.

    Grüssli



  • Jo, ich versteh zwar, was gemeint ist mit "Speicher aufbewahren", aber wie ich es im Programm umsetzte? keine Ahnung 😉

    Zum 2ten. : Recht hast du, werde mal sehen, dass ich mir noch ein vernünftiges Buch besorge... danke schonmal für die Tipps,

    würde trotzdem gerne wissen, wie ich den speicher "aufbewahre".

    Grüße



  • Jo, ich versteh zwar, was gemeint ist mit "Speicher aufbewahren", aber wie ich es im Programm umsetzte? keine Ahnung 😉

    Zum 2ten. : Recht hast du, werde mal sehen, dass ich mir noch ein vernünftiges Buch besorge... danke schonmal für die Tipps,

    würde trotzdem gerne wissen, wie ich den speicher "aufbewahre".

    Grüße



  • so, habe jetzt versucht, die setopt Funktion in einem CURLcode Array zu speichern und per Inkrement quasi mitlaufen zu lassen. Funktioniert aber genausowenig. Ich finde es schon merkwürdig, da das Programm ja läuft, wenn ich ihm einen direkten String gebe. Über die Funktion ist es ja nichts anderes, also Rückgabewert habe ich ja auch einen string.

    Erschließt sich mir nicht.

    jede Hilfe Willkommen 😉



  • Dann mach mal ne globale und schau, was damit gemacht wird..



  • jo, das mit der Globalen hab ich auch schon versucht. Hilft alles nichts 😉 naja, schade eigentlich. Habe gestern bisschen in der WinHTTP API gelesen und damit kann ich ja eigentlich auch einen POST request schicken. Vielleicht funktionierts ja damit. Versuche es jedenfalls mal wenn ich daheim bin, hehe.


Anmelden zum Antworten