bufferevent主要就是服务于网络通信 bufferevent是带有buf的事件: 创建: 销毁 对比event: 回调函数类型: read回调函数: 其中bufferevent_read()函数的原型: 写回调函数其实意义不大,因为它就是在写完之后再发送一个写完的信号而已,我们只需要一个代替write的写函数即可 默认: 新建的bufferevent写缓冲是enable,而读缓冲是disable的 bufferevent的网络通信知识前提: 客户端: 服务器: flags可取值: 返回值: 回调函数,一旦被回调,说明在其内部应该与客户端完成数据读写操作进行通信
bufferevent的特性:
头文件#include<event2/bufferevent.h>
原理:bufferevent有两个缓冲区,用队列实现,先进先出
读:有数据—> 读的回调函数被调用 —> 使用bufferevent_read() —>读数据
写:使用bufferevent_write() —> 向缓冲区中写数 —> 该缓冲区有数据自动写出 —> 写完,回调函数被调用
带缓冲区的事件创建、缓冲
struct bufferevent bufferevent_socket_new(struct event_base *base, evutil_socket_t fd, enum bufferevent_options options);
*
1,base;
2,fd封装到bufferevent内的fd;
3,options:基本就用BEV_OPT_CLOSE_ON_FREE,表示释放bufferevent时关闭底层传输端口,即关闭底层套接字,释放底层bufferevent等
返回:成功创建bufferevent事件对象void bufferevent_socket_free(struct bufferevent *ev);
给bufferevent事件对象设置回调
event_new(fd, callback);——->创建ev中自带cb,event_add再挂到event_base上即可
bufferevent_socket_new(fd) 没有cb所以需要再一个函数用于来专门设置回调bufferevent_setcb(callback)
因为有两个缓冲区,所以要设置读写回调函数,并加一个事件回调函数
void bufferevent_setcb(struct bufferevent *bufev,
bufferevent_data_cb readcb, bufferevent_data_cb writecb,
bufferevent_event_cb eventcb, void *cbarg);
bufev:缓冲区事件
readcb:设置bufferevent读缓冲,对应回调read_cb{bufferevent_read() 读数据 }
writecb:设置bufferevent写缓冲,对应回调write_cb{ }—给调用者发送写成功通知,可以NULL
eventcb:设置事件回调。也可传NULLtypedef void (*bufferevent_data_cb)(struct bufferevent *bev, void *ctx);
void read_cb(struct bufferevent *bev, void *cbarg) { ... bufferevent_read(); }
size_t bufferevent_read(struct bufferevent *bev, void buf, size_t bufsize);
int bufferevent_write(struct bufferevent *bufev, const void *data, size_t size);
禁用和启用缓冲区
1,void bufferevent_enable(struct bufferevent *bufev, short events);
启用缓冲区
2,void bufferevent_disable(struct bufferevent * bufev, short events);
禁用
3,short bufferevent_get_enabled(struct bufferevent *bufev);
获取缓冲区的禁用状态,需要借助&来得到
其中第二个参数events可以取EV_READ、EV_WRITE、EV_READ|EV_WRITE
客户端和服务器连接和监听⭐
socket(); connect() —–>
int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *address, int addrlen);
参数1; bev = bufferevent 事件对象(封装了fd)
参数2/3的 address、len等同于connect()的参数2/3
socket(); bind(); listen(); accept(); —–>
evconnlistener_new_bind()
这个函数可以完成系统调用socket(); bind(); listen(); accept();
四个函数的作用#include<event2/listener.h> ... //服务器创建监听器 struct evconnlistener *evconnlistener_new_bind( struct event_base *base, evconnlistener_cb cb,//监听回调函数,接收连接之后,用户要做的操作 void *ptr,//回调函数的参数 unsigned flags,//可以识别的标志 int backlog,//时listen()函数的第二个参数,即同时连接的最大数,传-1就表示使用默认的最大值128 const struct sockaddr *sa,//服务器+Port,是一个传入函数,是服务器自己的地址结构 int socklen//sa的大小 );
LEV_OPT_CLOSE_ON_FREE
释放bufferevent时关闭底层传输端口,这将关闭底层套接字,释放底层bufferevent等
LEV_OPT_REUSEABLE
端口复用,可以“|”struct evconnlistener *listener
成功创建的监听器
回调函数类型👇:【注意】该回调函数不是由我们调用的,是框架自动调用typedef void (*evconnlistener_cb)( struct evconnlistener *listener,//上面监听器evconnlistener_new_bind函数的返回值 evutil_socket sock,//用于通信的文件描述符 struct sockaddr *addr,//客户端IP+端口 int len,//客户端地址的长度 void *ptr;//外部传来的回调函数要用的参数 );
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算