libevent: Чтение всех байтов из буфера

У меня есть следующая функция обратного вызова чтения 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 по адресу исходный код. Жестко закодированный предел.


person Arun Kaushik    schedule 23.08.2016    source источник
comment
Можете ли вы попробовать изменить %zu на %lu? en.cppreference.com/w/cpp/io/c/fprintf   -  person spectre-d    schedule 23.08.2016


Ответы (1)


Может быть, вы могли бы попытаться объявить evbuffer_ptr и установить его внутреннюю цепочку в первый элемент вашего evbuffer,

struct evbuffer_ptr ptr_ev;
struct evbuffer *buf;

ptr_ev.pos = 0;
ptr_ev._internal.chain = buf->first;
ptr_ev._internal.pos_in_chain = 0;
ptr_ev._internal.chain = ptr_ev._internal.chain->next;    

(и цикл до следующего нажатия null )

Также вы, возможно, могли бы попробовать использовать evbuffer_readln в цикле,

 char * evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
            enum evbuffer_eol_style eol_style)
person Anatoly Strashkevich    schedule 23.08.2016
comment
Это не правильно, потому что evbuffer_readln просто ищет \n в первой цепочке - person sam; 04.12.2016