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 };

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2012-08-22 17:06  blankqdb  阅读(979)  评论(0)    收藏  举报