我有读取回调函数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的源代码之后,我在source code找到了这行代码#define EVBUFFER_MAX_READ 4096
。硬编码限制。
答案 0 :(得分: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)