Bufferevent与evbuffer
一. 前言
bufferevent和evbuffer互相配合实现非常好用的带缓冲的IO。它在非阻塞IO网络编程中非常有用。例如,给定一个非阻塞的网络文件描述符fd,我们想向其中定入很长的一段数据,由于是进非阻塞的,我们无法通过一个while循环将所有的数据写到fd。这里我们可以使用bufferevent:
1. 把数据拷贝到一个evbuffer中。
2. 让bufferevent监听fd。
3. 一旦fd可写,调用n = write(fd, ...)往fd中写一定的数据, write()返回真正写的数量。
4. 把写了的数据从evbuffer中移去。
二. evbuffer工作原理
1. evbuffer结构体
1 struct evbuffer 2 3 { 4 5 u_char *buffer; // 当前有效缓冲区的内存起始地址 6 7 u_char *orig_buffer; // 整个分配用来缓冲的内存起始地址 8 9 size_t misalign; // origin buffer 和 buffer之间的字节数 10 11 size_t totallen; // 整个分配用来缓冲的内存字节数 12 13 size_t off; // 当前有效缓冲区的长度(字节数) 14 15 void (*cb)(struct evbuffer *, size_t, size_t, void *); //回调函数,当缓冲区有变化的时候会被调用 16 17 void *cbarg; // 传递给回调函数的参数 18 19 };
浙公网安备 33010602011771号