libevent:从缓冲区读取所有字节
Posted
技术标签:
【中文标题】libevent:从缓冲区读取所有字节【英文标题】:libevent: Reading all bytes from buffer 【发布时间】:2016-08-23 16:57:41 【问题描述】:我有以下读取回调函数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
这行代码。硬编码限制。
【问题讨论】:
您可以尝试将%zu
更改为%lu
吗? 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;
(并循环直到下一次命中 null )
您也可以尝试在循环中使用 evbuffer_readln,
char * evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out,
enum evbuffer_eol_style eol_style)
【讨论】:
它不正确,因为 evbuffer_readln 只是在第一个链上查找 \n以上是关于libevent:从缓冲区读取所有字节的主要内容,如果未能解决你的问题,请参考以下文章