请教libevent 回调函数的神奇函数bufferevent

libevent2.0目录结构_文档下载
亿万文档 免费下载
当前位置: &
& libevent2.0目录结构
libevent2.0目录结构
基础函数用event_base_new 创建struct event_base *base ,在bind,listen完后,用event_new 创建struct event *listener_event用于监听是否有链接到达通过event_add 将event添加到base中在处理连接到达函数中添加读写eventevent_base_dispatch(base),进行启动,其实就是个循环event_free释放event使用内置bufferevent,会自动收发数据,有点像preactor从监听处理函数开始有变化,在监听处理函数中这么做:struct bufferevent *evutil_make_socket_nonblocking(fd);bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE);bufferevent_setcb(bev, readcb, NULL, errorcb, NULL);//设置读写回调bufferevent_setwatermark(bev, EV_READ, 0, MAX_LINE);bufferevent_enable(bev, EV_READ|EV_WRITE);//设置bev关心的事件之后只要在读回调函数中取到bufferevent内部的input,output指针然后evbuffer_* 函数读取数据,而要发送数据只要将数据通过evbuffer_add添加到output,释放bufferevent 通过调用bufferevent_free设置libevent在complie libevent的时候指定CFLAGS=-DUSE_DEBUG可以取到底层更详细的loglog函数设置event_set_log_callback,log开关event_enable_debug_logging,log level标志要使用最新的,_开头的已被弃用fatal error默认调用exit或abort,不过也可以用event_set_fatal_callback设置自己的fatal函数,不过要注意如果调用过自己的处理函数后,不能在调用libevent 任何函数默认情况多线程是不支持的(即没有设置lock,condition等),如果要使libevent支持多线程,在event_base_new前面要调下面函数int evthread_use_windows_threads(void);//win上设置int evthread_use_pthreads(void);
//unix上设置如果lock有错误可以通过evthread_enable_lock_debugging进行捕捉,通过assert会exit调试event使用event_enable_debug_mode在使用bufferevent时,如果在创建bufferevent的时候,指定了BEV_OPT_THREADSAFE,那么new bufferevent过程的内部函数会调用bufferevent_enable_locking和evbuffer_enable_locking如果设置过了evthread_use_pthreads,那么bufferevent和从bufferevent取到的evbuffer都会变成线程安全否则bufferevent和evbuffer是不会保证线程安全的,切记进程退出前libevent_global_shutdown做清理,其实可以不用创建event_base,觉得默认还是直接event_base_new要好点struct event_config *event_config_new(void);struct event_base *event_base_new_with_config(const struct event_config *cfg);void event_config_free(struct event_config *cfg);int event_config_avoid_method(struct event_config *cfg, const char *method);int event_config_require_features(struct event_config *cfg,enum event_method_feature feature);event_config_set_num_cpus_hintevent_base_free 不会清理关联在base上的event,socket!event_base_priority_init可设置base优先级,如果优先级设置有限则关联进来的event优先级在0至EVENT_MAX_PRIORITIES -1运行event lo
Word文档免费下载: (下载1-6页,共6页)
? (还存在不在 event2目录中的较老版本 libevent 的头文件,请参考下节:如果...2.0版之前不支持锁定:只有确定不同时在多个线程中使用同一个结构体时,libevent...6、在【解决方案“httpd”】上点击鼠标右键,选择【属性】 7、将【配置】改为“Release” 8、将“D:\libevent-2.0.10-stable\include”整个目录复制到“D:\...直接依赖这类头文件中的任何 结构体都会破坏程序对其他版本 libevent 的二进制...较老版本的 libevent 头文件较少,也不安装在 event2 目录中。 在 2.0 以及...vc使用libevent网络库_计算机软件及应用_IT/计算机_专业资料。Windows 平台下 libevent 库的使用 1 引子 手头上有一个使用了 4 个年头的 HttpClient 库,自己封...Libevent 简单介绍 目录 2/10 Libevent 简单介绍 1 简介主页:http://www....可以用 event_add 把该事件结构增加到事件循环,用 event_del 从事件循环中删除...Libevent框架简介_IT/计算机_专业资料 暂无评价0人阅读0次下载举报文档 Libevent框架简介_IT/计算机_专业资料。今日推荐 180份文档 ...这一步相当于初始化一个 event handler, 在 libevent 中事件类型保存在 event 结构体中。 注意:libevent 并不会管理 event 事件集合,这需要应用程序自行管理; ...Libevent默认情况下是单线程,每个线程有 且仅有一个event_base,对应一个struct event_base结构体,以及一个事件管理器, 用来安排托管给event_base结构体的一系列 ...libevent 使用 event 结构体将这 3 种事件的处理统一起来; 2)ev_next,ev_active_next 和 ev_signal_next 都是双向链表节点指针;它们是 libevent 对不同事件...libevent使用介绍_计算机软件及应用_IT/计算机_专业资料。在 linux 平台上使用 c 开发网络程序的同志们一般情况下都对鼎鼎大名的 libevent 非常的熟 悉了。但是...Libevent 框架及事件处理流程 4.1libevent 框架 4.2libevent 事件处理流程 libevent 库的核心结构 event 4.3libevent 对 event 的管理 struct event { TAILQ_ENTRY...您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
使用libevent编写linux服务.doc 5页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
需要金币:100 &&
你可能关注的文档:
··········
··········
使用libevent编写linux服务(一)
由于百度对文章长度的限制,不得不将其分为多篇文章,还请大家谅解
使用libevent编写linux服务(一)
一 libevent简介
libevent是一个支持Windows、linux和bsd等平台的网络事件驱动程序库。它支持多种I/O服用机制,按照优先级从高到低依次为:evport、kqueue、epoll、devpoll、rtsig、poll、select。它可根据操作系统,按照优先级从高到底自主选择驱动。
???? 用户可以通过/~provos/libevent/来获取libevent的源码、libevent出现的背景、以及其他一些详细资料。
二 libevent的使用
1 初始化事件??
我们首先完成对libenvent的事件初始化和事件驱动模型的选择。(在使用多线程的情况下,一般我们需获取所返回的事件根基)
main_base = event_init();
event_init函数返回的是一个event_base对象,该对象包括了事件处理过程中的一些全局变量,其结构为:
struct event_base { ??? const struct eventop * ??? void * ??? int event_??????? /* counts number of total events */ ??? int event_count_ /* counts number of active events */
int event_????? /* Set to terminate loop */ ??? int event_??????? /* Set to terminate loop immediately */
??? /* active event management */ ??? struct event_list ** ???
??? /* signal handling info */ ??? struct evsignal_
??? struct event_ ??? struct timeval event_
??? struct min_
??? struct timeval tv_ };
2 添加事件
??????? 在事件初始化完毕后,我们可以使用event_set设置事件,然后使用event_add将其加入。
?? 这里我们首先完成socket的监听,然后将其加入的事件队列中(这里我们对所有的异常都不做考虑)。
(1)socket监听
struct sockaddr_in listen_
int port = 10000; //socket监听端口
?? int listen_fd = socket(AF_INET, SOCK_STREAM, 0);
?? memset(&listen_addr, 0, sizeof(listen_addr));
??? listen_addr.sin_family = AF_INET; ??? listen_addr.sin_addr.s_addr = INADDR_ANY; ??? listen_addr.sin_port = htons(port)
?? reuseaddr_on = 1;
setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_on, sizeof(reuseaddr_on)) #支持端口复用
bind(listen_fd, (struct sockaddr *) &listen_addr, sizeof(listen_addr))'
listen(listen_fd, 1024);
/*将描述符设置为非阻塞*/
int flags = fcntl(listen_fd,, F_GETFL);
flags |= O_NONBLOCK;
fcntl(listen_fd, F_SETFL, flags);
(2)事件设置
????? socket服务建立后,就可以进行事件设置。我们使用event_set来设置事件对象,其传入参数包括事件根基(event_base对象),描述符,事件类型,事件发生时的回调函数,回调函数传入参数。其中事件类型包
正在加载中,请稍后...您的访问出错了(404错误)
很抱歉,您要访问的页面不存在。
1、请检查您输入的地址是否正确。
进行查找。
3、感谢您使用本站,1秒后自动跳转

我要回帖

更多关于 libevent函数 的文章

 

随机推荐