2016-08-23 90 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); 
} 

更新 近距離觀察到的libevent的源代碼後,我發現,這行代碼#define EVBUFFER_MAX_READ 4096source 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