2016-08-23 11 views
1

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

+0

Можете ли вы попробовать изменить '% zu' на'% lu'? http://en.cppreference.com/w/cpp/io/c/fprintf –

ответ

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;  

(и цикл до следующего хита нуль)

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

char * evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out, 
      enum evbuffer_eol_style eol_style) 
+0

Это не правильно, потому что evbuffer_readln просто ищет \ n в первой цепочке – sam