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:从缓冲区读取所有字节的主要内容,如果未能解决你的问题,请参考以下文章

libevent & bufferevent

从缓冲区读取字节(字符)

如何从 Wasm 内存缓冲区中读取元组结构?

汇编 x86 从任何文件读取并转义所有特殊字符并以字节为单位获取文件大小

从 golang 中的缓冲读取器读取特定数量的字节

java IO和NIO区别