У меня есть следующая функция обратного вызова чтения readcb
, которая вызывается при событии чтения. Моя проблема в том, что bufferevent_get_input
читает только 4096 байт из базового буфера. Как я могу заставить его читать все байты. Я также использовал вариант, указанный ниже как readcb_variant
. Он также читает только 4096 байт и существует с n = 0
, что означает, что больше байтов для чтения нет.
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);
}
Обновление После тщательного изучения исходного кода libevent я нашел эту строку кода #define EVBUFFER_MAX_READ 4096
по адресу исходный код. Жестко закодированный предел.
%zu
на%lu
? en.cppreference.com/w/cpp/io/c/fprintf - person spectre-d   schedule 23.08.2016