hallo, ich verwende libcurl, um in einem c-programm daten von http-servern zu laden. dabei verwende ich um die 20 threads. jeder thread hat eine verbindung, mit der er daten lädt. allerdings will ich nicht 20 callback-funktionen deklarieren. ist es nicht möglich, die empfangenen daten statt in eine datei oder über die callback-funktion direkt in einen buffer zu schreiben? eine einzige callback-funktion würde mir auch nicht helfen, da sich dann ja die threads blockieren. mfg laurenz
Programmier doch einen Callback und gib dem mit CURLOPT_WRITEDATA einen Parameter auf irgendeinen Puffer mit.
sieht gut aus, werde ich gleich mal testen. aber dann ruft doch immernoch jeder thread die callbackfunktion auf, was ja eigendlich nicht gewollt ist, oder?
Spricht was dagegen? Du musst dann halt dafür sorgen, dass dein Callback eintrittsinvariant ist. Das heißt, er darf nur von dem abhängen, was du ihm als Parameter mitgibst, und nicht noch von globalen Variablen o.ä.
stimmt, du hast recht. da es ja um das herunterladen von daten geht, wird die funktion wohl kaum bremsen.
Huch, jetzt wollt ich grad ne Änderung für Deinen Code posten un nu isser wech :( Hier trotzdem:
1 | size_t write_data(void *ptr, size_t size, size_t nmemb, char *buf) { |
2 | long i; |
3 | |
4 | buf += strlen(buf); |
5 | for(i=0; i<(nmemb*size); i++) { |
6 | *(buf+i)=*((char*)ptr+i); |
7 | }
|
8 | |
9 | return nmemb*size; |
10 | }
|
Ok, man sollte natürlich das abschließende '\0' bei Strings nicht vergessen :(
1 | size_t write_data(void *ptr, size_t size, size_t nmemb, char *buf) { |
2 | long i; |
3 | buf += strlen(buf); |
4 | for(i=0; i<(nmemb*size); i++) { |
5 | *(buf+i)=*((char*)ptr+i); |
6 | }
|
7 | *(buf+i)='\0'; |
8 | return nmemb*size; |
9 | }
|
so, jetzt hab ich eine funktionierende funktion:
1 | size_t write_data(void *ptr, size_t size, size_t nmemb, char *buf) { |
2 | long i, tmp; |
3 | |
4 | tmp=strlen(buf); |
5 | |
6 | for(i=0; i<(nmemb*size); i++) { |
7 | *(buf+(i+tmp))=*((char*)ptr+i); |
8 | }
|
9 | |
10 | return nmemb*size; |
11 | }
|
ich musste auf den zeiger buf noch den startwert (tmp) addieren, da ja sonst immer wieder bei 0 angefangen würde.
Laurenz K. schrieb: > ich musste auf den zeiger buf noch den startwert (tmp) addieren, da ja > sonst immer wieder bei 0 angefangen würde. Richtig. Du machst das aber bei jedem Schleifendurchlauf. Einmalig vor der Schleife reicht vollkommen. Genau dazu dient folgende Zeile im Posting davor:
1 | buf += strlen(buf); |
Wenn Du Glück hast erkennt das der Compiler aber auch selber und der erzeugte Maschinecode ist eh derselbe. Du hast allerdings denselben Fehler gemacht wie ich und die abschließende Null vergessen. Ohne die funtioniert das strlen nicht! Und eine Überprüfung, ob im durch buf angegebene Puffer überhaupt noch genug Platz ist wäre wohl ebenfalls angebracht. CU
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.