libcurl - daten direkt in buffer schreiben

OP #2173585
Lesenswert?

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
Gast #2173727
Lesenswert?

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.ä.
Gast #2173883
Lesenswert?

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
}
Gast #2173886
Lesenswert?

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
}
OP #2174020
Lesenswert?

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.
Gast #2176511
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren