2016-03-11 8 views
0

Я отправляю данные из файла, используя обратный вызов сообщения Libcurl. В примере here показано, как отправлять данные как 1 байт за звонок из функции обратного вызова. Я изменил код, поэтому файл читается в куски. Это очень хорошо работает.C++ libCurl: функция обратного вызова после отправки более одного байта

текущий код образца:

if(sizeleft){ 
*(char *)ptr = readptr[0]; 
    readptr++; 
    sizeleft--; 
    return 1; 
} 

Этот пример отправляет данные в 1 байт. , но предположим, что мне нужно отправить несколько байтов. Я попытался увеличить readptr by two each time and decreasing sizeleft by two и i return 2bytes at a time.

Это не работает, как этот, и данные повреждены.

Буду признателен, если кто-то может помочь мне. Спасибо

ответ

2

Трудно сказать по вашему вопросу, что именно вы делаете, именно то, что вы ожидаете, и что именно происходит на самом деле. Однако похоже, что вы на правильном пути.

documentation для CURLOPT_READFUNCTION утверждает, что size * nitems (ака size * nmemb в примере) является верхнего пределом числа байт, вы можете написать в buffer, и возвращаемое значение вашей функции является фактического числа байт что вы написали. Возврат нуля означает, что вы написали все, что хотите написать, и ваша функция обратного вызова больше не будет вызываться.

Если значение, возвращаемое функцией, не совпадает с количеством байтов, которое вы фактически написали в буфер, тогда вы можете ожидать повреждения.

PS: Что-то вроде:

// copy as many bytes as we can, up to either: 
// * The number of bytes we have remaining. 
// or 
// * The space available in ptr. 
size_t maxBytes = size * nmemb; 
size_t numBytes = std::min (maxBytes, sizeleft); 
memcpy (ptr, readptr, numBytes); 
readptr += numBytes; 
sizeleft -= numBytes; 
return numBytes; 
+0

У меня есть путаница 'станд :: макс (maxBytes, sizeleft)'. 'std :: max' вернет максимум maxBytes или sizeleft. если возвращается sizeleft, это означает, что он сработает? Я предполагаю, что это должно быть 'std :: min', поэтому всегда минимальное значение, чем maxbytes. что также будет равносильно равному, если оба размера и максбайт равны. –

+0

Да, должно быть std :: min, я отредактирую ответ, чтобы это отразить. Спасибо за место! – peterpi

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