我有以下讀取回調函數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 4096
在source code。硬編碼限制。
您可以嘗試將'%zu'更改爲'%lu'嗎? http://en.cppreference.com/w/cpp/io/c/fprintf –