C++ libcurl + POST

badday

Commander
Registriert
Sep. 2007
Beiträge
3.023
Moin zusammen,

ich schreibe gerade an einem Programm und benutze dort libcurl. Ich sende an einen Server Daten, der mir dann antwortet. Diese Antwort überprüfe ich. Soweit so gut. Es funktioniert auch, allerdings dauert jeder request etwa 1 min. OK, der typische http-timeout, aber: Das ganze funktioniert tatsächlich, d. h. am Server kommt alles an, er antwortet, dies wird ausgewertet und am Ende steht der der return code CURLE_OK.

Dies finde ich etwas merkwürdig. Der Server antwortet sofort (kann ich via Wireshark sehen), die Serverantwort wird mit meiner eigenen Funktion auch überprüft (ohne Verzögerung), danach aber passiert offenbar nichts für ca. 1 min.

Hier der relevante Code:
Code:
	curl = curl_easy_init();
	if(curl) {
		CURLcode res;

		struct curl_slist *headers=NULL;
		headers = curl_slist_append(headers, "Accept: application/json");	
		curl_slist_append( headers, "Content-Type: application/json" );
		curl_slist_append( headers, "charsets: utf-8" );
		curl_easy_setopt(curl, CURLOPT_URL, targetaddress.c_str());
		curl_easy_setopt(curl, CURLOPT_PORT, 1234);			
		curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);        
		curl_easy_setopt(curl, CURLOPT_POSTFIELDSIZE, sizeof(char)*(utf8string.length()));
		curl_easy_setopt(curl, CURLOPT_POSTFIELDS, utf8string.data());
		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, checkServerAnswer); 
		
		
		/* Perform the request, res will get the return code */ 
		res = curl_easy_perform(curl);

 
		/* always cleanup */ 
		curl_easy_cleanup(curl);
		curl_slist_free_all(headers);
}

Die Überprüfungsfunktion ist trivial (checkServerAnswer), darin hängt er auch nicht, daher verzichte ich vorerst auf das Posten.

Ich hoffe, jemand weiß Rat :)


Vielen Dank,

badday
 
Du hast auch immer die schweren Fragen die keiner beantworten kann oder? :)

Ich würde auf die oberste zeile n Haltpunkt setzen und Zeilenweise durchspringen (F10 in MSVC) mit dem Debugger. Dort wo der Debugger nicht wieder zurück kommt aus der Funktion wird er warten bis zum timeout. Evtl kannst du auch in die Funktion reinspringen (F11 im MSVC). Ist zwar keine Lösung aber könnte das Problem eingrenzen wo überhaupt gewartet wird auf den Timeout.
 
Der Punkt ist ja, dass es offenbar nicht zum time-out zu kommen scheint, da der return-code ja angibt, alles sei in Ordnung.
 
Ja aber irgendwo muss dein Prozess ja in der Schleife laufen, sonnst würde es ja alles passen, die Frage ist wo er das macht. Der Rückgabewert ist in dem Fall wohl für die Katz.

Edit: Also ich habs gerade mal bei mir ausprobiert. Aber ohne genauere angaben zum Script das verarbeitet und/oder den Post Daten die du übergibst ist leider absolut nichts drin mit Fehler genauer analysieren. Bei mir läufts, allerdings nur ne normale HTTP abfrage
 
Zuletzt bearbeitet:
Problem gelöst, es lag daran, dass der Server keine content-lenght zurückgab.

Gruß,

badday
 
Also hat der Server mit Chunked Encoding geantwortet? Dann darf natürlich CL nicht gesetzt sein.
Müsste aber eigentlich auch funktionieren bzw. Curl sollte das können. Wie man das realisiert, weiß ich zugegebener Maßen nicht, da ich mit der Curl-API noch nicht großartig etwas gemacht habe.
Klingt aber ein wenig danach, als wenn du explizit auf die CL gewartet hast? Als Programmierübung sicherlich sinnvoll, dass man auch Chunked richtig verarbeitet. :)
 
Zurück
Oben