#include<event2/bufferevent.h>#include<event2/buffer.h>#include<ctype.h>voidread_callback_uppercase(struct bufferevent *bev,void*ctx){ /* This callback removes the data from bev's input buffer 128 bytes at a time, uppercases it, and starts sending it back. (Watch out! In practice, you shouldn't use toupper to implement a network protocol, unless you know for a fact that the current locale is the one you want to be using.) */chartmp[128];size_t n;int i;while (1) { n =bufferevent_read(bev, tmp,sizeof(tmp));if (n <=0)break; /* No more data. */for (i=0; i<n; ++i)tmp[i] =toupper(tmp[i]);bufferevent_write(bev, tmp, n); }}structproxy_info {structbufferevent*other_bev;};voidread_callback_proxy(struct bufferevent *bev,void*ctx){ /* You might use a function like this if you're implementing a simple proxy: it will take data from one connection (on bev), and write it to another, copying as little as possible. */structproxy_info*inf= ctx;bufferevent_read_buffer(bev,bufferevent_get_output(inf->other_bev));}structcount {unsignedlonglast_fib[2];};voidwrite_callback_fibonacci(struct bufferevent *bev,void*ctx){ /* Here's a callback that adds some Fibonacci numbers to the output buffer of bev. It stops once we have added 1k of data; once this data is drained, we'll add more. */structcount*c= ctx;structevbuffer*tmp=evbuffer_new();while (evbuffer_get_length(tmp) <1024) {unsignedlong next =c->last_fib[0] +c->last_fib[1];c->last_fib[0] =c->last_fib[1];c->last_fib[1] = next;evbuffer_add_printf(tmp,"%lu", next); } /* Now we add the whole contents of tmp to bev. */bufferevent_write_buffer(bev, tmp); /* We don't need tmp any longer. */evbuffer_free(tmp);}