私は、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
のこの行を見つけました。ハードコーディングされた制限。
'%zu'を'%lu'に変更できますか? http://en.cppreference.com/w/cpp/io/c/fprintf –