libcurl - daten direkt in buffer schreiben

OP #2173585
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
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
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 15 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.