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

时间:2016-08-23 16:57:42

标签: c libevent

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

1 个答案:

答案 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)