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

标签 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 .硬编码限制。

最佳答案

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

相关文章:

c - malloc_atfork 中的死锁

c++ - std vector 、堆栈和队列中的原始指针

php - ajax 调用从 php libevent 客户端获取连续/流数据

c - 从 C 函数返回局部变量

c - 两个无符号长整型的 printf 奇怪问题

linux - 如何正确使用libevent的信号事件

c - 如何通过libevent创建tcp客户端

c - 从这个示例代码中获取libev远程IP地址?

C 如何在使用 struct* = struct 时解析不兼容指针类型的赋值

c++ - 从另一个线程中断 event_base_dispatch