关于libevent库libevent是一个轻量级的开源高性能网络库,有几个显着的亮点:事件驱动(event-driven),高性能;轻量级,专注于网络,不像ACE那样臃肿;源代码相当精致且易于阅读;跨平台,支持Windows、Linux、*BSD和MacOs;支持多种I/O多路复用技术,epoll、poll、dev/poll、select和kqueue等;支持I/O、定时器和信号事件;注册事件优先级;Libevent已经被广泛用作底层网络库;例如memcached、Vomit、Nylon、Netchat等。关于libevent的安装下载安装包官网:http://www.monkey.org/~provos...下载地址:http://www.monkey.org/~provos...解压#tarzxvflibevent-2.0.10-stable.tar.gz进入目录#cdlibevent-2.0.10-stable切换到root#suinstallgcc#yuminstallgcc设置安装路径如果不加这句,默认安装目录是/usr/local/lib#./configure--prefix=/usrcompile#makeinstall#makeinstall测试libevent是否安装成功:#ls-al/usr/lib|greplibeventlrwxrwxrwx1rootroot2111??1217:38libevent-1.2.so.1->libevent-1.2.so.1.0.3-rwxr-xr-x1rootroot26354611??1217:38libevent-1.2.so.1.0.3-rw-r–r–1rootroot45415611??1217:38libevent.a-rwxr-xr-x1rootroot81111??1217:38libevent.lalrwxrwxrwx1rootroot2111??1217:38libevent.so->libevent-1.2.so.1.0.3安装问题经常报openssl问题。首先检查你是否安装了libevent。我给小伙伴们重新配置环境的时候,总是报错。该试的都试了,最后的结果在/usr/local/lib/下看到了一堆libevent.so,这真是,太无语了。言归正传,如果没有设置./configure,默认安装目录在/usr/local/lib下。安装前应该看一看,不会吃亏的。如果它不起作用,你可以找到它。如果实在不行,那可能openssl目录不在系统默认路径下,可以加个软连接??#ln-sf/usr/local/ssl/include/openssl/usr/include/openssl如果还是有问题,那可能是你的openssl版本太低了,你可以试试升级#yumupdateopenssl-ylibeventuse第一个例子:intmain(){intsockfd=create_socket();structevent_base*base=event_init();断言(基础!=NULL);structevent*ev_sock=event_new(base,sockfd,EV_READ|EV_PERSIST,accept_cb,(void*)base);断言(ev_sock!=NULL);事件添加(ev_sock,NULL);event_base_dispatch(基地);event_free(ev_sock);event_base_free(base);}第二个例子:intmain(){structevent_base*base=event_init();结构事件*signal_event=evsignal_new(base,SIGINT,signal_cb,base);事件添加(信号事件,NULL);结构timevaltv={3,0};结构事件*timeout_event=evtimer_new(base,timeout_cb,NULL);事件添加(超时事件,电视);event_base_dispatch(基地);event_free(时间eout_event);event_free(signal_event);event_base_free(base);}这两个简单的例子体现了使用事件库时的代码逻辑:首先使用event_init()构建一个event_base对象来创建一个特定的事件event*用来表示一个特定的事件,使用evsignal_new,或者evtimer_new来注册事件,这两个函数本质上都是对函数event_new()的封装structevent*event_new(structevent_base*base,evutil_socket_tfd,shortevent,void(*cb)(evutil_socket_tfd,shortevent,void*arg),void*arg);//短事件使用的宏名#defineEV_TIMEOUT0x01//定时时间#defineEV_READ0x01//可读时间#defineEV_WRITE0x01//可写时间#defineEV_SIGNAL0x01//信号时间#defineEV_PERSIST0x01//永久时间#defineEV_ET0x20//边缘触发,epoll下的ET模式调用event_add()函数,将事件注册到事件表中调用event_base_dispatch()执行事件循环event结束后,使用event_free()来释放事件资源,使用event_base_free()释放event_free对象。如果事件表都是一次性事件,则事件触发后结束,不再监听evtimer_new()。默认的超时事件是一个一次性的事件,如果需要多次监听,可以从event_new中详细设置。在event_new()中,信号事件直接写入fd处的信号名。如果是超时事件,用-1表示
