gpt4 book ai didi

c - libevent:从缓冲区读取所有字节

转载 作者:太空宇宙 更新时间:2023-11-04 03:28:42 25 4
gpt4 key购买 nike

我有以下读取回调函数 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 .硬编码限制。

最佳答案

也许你可以尝试声明 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)

关于c - libevent:从缓冲区读取所有字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39106868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com