2012-06-07 3 views
0

Я использую libcurl в своем коде, и первые несколько попыток curl_easy_perform() возвращают правильные значения, но после этого я вижу, что удаляются первые 800 или около того. Передана функция указателя write_data начинает указывать на поток после первых 800 байтов или около того.curl_easy_perform возвращает частичные результаты после точки

Вот фрагмент кода, который я использую -

ctx = curl_easy_init(); 
curl_easy_setopt(ctx, CURLOPT_POSTFIELDS, bodyData); 
curl_easy_setopt(ctx, CURLOPT_URL, serverUrl); 
curl_easy_setopt(ctx, CURLOPT_WRITEFUNCTION, write_data); 
curl_easy_setopt(ctx, CURLOPT_WRITEDATA, response); 
res = curl_easy_perform(ctx); 
curl_easy_cleanup(ctx); 

EDIT: Хорошо, так что я вижу, что для некоторых запросов, то write_data вызывается дважды для одного curl_easy_perform(). Поэтому write_data получает первые x байтов, а затем считывает оставшиеся в следующий раз. Но моя функция write_data переопределяет указатель ответа каждый раз. Как узнать, нужна ли мне memcpy или конкатенация указателю ответа? Надеюсь, что смогу правильно описать ситуацию.

Благодаря

P

+0

Есть рабочий код в https://curl.haxx.se/libcurl/c/getinmemory.html – danielapsmaior

ответ

3

Необходимо предоставить большой буфер (указатель «отклик»), и каждый раз, когда вы вызываете функцию write_data, вы добавляете больше данных в буфер. Ваш указатель ответа, вероятно, следует указать на структуру, что-то вроде этого:

struct myStruct{ 
    char *buffer; /* remember to malloc this! */ 
    int size; /* 100000 */ 
    int used; /* initially 0 */ 
}; 
typedef struct myStruct myStruct; 

Затем на каждом входе в функцию write_data вы хотите тетср прилагаемых данных в буфер после последней позиции вы писали (помните, Прилагаемый буфер write_data не обязательно нуль), например:

size_t write_data(char *ptr, size_t size, size_t nmemb, void *userdata) 
{ 
    myStruct *parseBuf = (myStruct *)userdata; 
    int total_size = size * nmemb; 
    memcpy(parseBuf->buffer+parseBuf->used, ptr, total_size); 
    parseBuf->used += total_size; 
    *(parseBuf->buf+parseBuf->used) = 0; /* Add a null terminator on */ 
    return size * nmemb; 
} 

Нечто подобное должно сделать это. (отказ от ответственности: я не потрудился попробовать компилировать это, но он должен работать)

+0

Это именно то, что я нашел. Спасибо за ответ – user220201

0

CURLOPT_WRITEFUNCTION обратного вызова не будет называться ни один, один или несколько раз для одного запроса. Ваша функция должна правильно обрабатывать.

+0

Да. Это то, что я понял. – user220201

Смежные вопросы