У меня есть следующая функция обратного вызова readcb
, которая вызывается при чтении события. Моя проблема: bufferevent_get_input
читает только 4096 байт из базового буфера. Как я могу заставить его читать все байты. Я также использовал вариант, приведенный ниже как readcb_variant
. Он также читает только 4096 байт и существует с n = 0
, значит, больше не нужно читать байты.libevent: Чтение всех байтов из буфера
void readcb(struct bufferevent *bev, void *ctx){
size_t bytesread;
char buf[10000];
struct evbuffer *input, *output;
input = bufferevent_get_input(bev);
bytesread = evbuffer_get_length(input);
evbuffer_remove(input, buf, bytesread);
printf("%zu\n", bytesread); // prints 4096 for long (> 4096) byte stream
do_some_cool_stuff(buf);
}
void readcb_variant(struct bufferevent *bev, void *ctx){
char tmp[1000], buf[10000];
size_t n, bytesread = 0;
char *runner = buf;
while(1){
n = bufferevent_read(bev, tmp, sizeof(tmp));
if (n <= 0){
printf("%zu\n", n); // prints '0';
break;
}
memcpy(runner, tmp, n);
runner += n;
bytesread += n;
}
printf("%zu\n", bytesread); // prints 4096 for long (> 4096) byte stream
do_some_cool_stuff(buf);
}
Update После внимательно посмотреть в исходный код Libevent, я нашел эту строку кода #define EVBUFFER_MAX_READ 4096
в source code. Предел жесткого кодирования.
Можете ли вы попробовать изменить '% zu' на'% lu'? http://en.cppreference.com/w/cpp/io/c/fprintf –