2016-08-23 7 views
1

私は、readイベントで呼び出される次のリードコールバック関数を持っています。私の問題は、bufferevent_get_inputは、下にあるバッファから4096バイトしか読み込みません。どのようにすべてのバイトを読み取ることができます。私はまた、readcb_variantとして下に与えられた変形を使用しました。また、4096バイトしか読み取らず、n = 0で存在します。これは、読み取るバイトがこれ以上ないことを意味します。libevent:バッファからすべてのバイトを読み取る

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のこの行を見つけました。ハードコーディングされた制限。

+0

'%zu'を'%lu'に変更できますか? http://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;  

しようとすることができかもしれませ

また、あなたは多分使用することを試みることができますevbuffer_readln in loop、

char * evbuffer_readln(struct evbuffer *buffer, size_t *n_read_out, 
      enum evbuffer_eol_style eol_style) 
+0

それはevbuffer_readlnのためだけに最初のチェーンでルックアップ\ nを修正しません – sam

関連する問題