libevent源代码分析-介绍、安装、使用
来源:互联网 发布:cisco 端口隔离 编辑:程序博客网 时间:2024/04/30 11:57
- Libevent介绍
- 安装
- 例子
Libevent介绍
在include\event2\event.h中有关于Libevent的介绍,这里简单翻译介绍一下:
Libevent是以事件为驱动的开发可扩展的网络服务端的库。开放的API设置事件的回调函数,当事件来临时调用这个回调函数。它还支持信号和定时器。
开发者只需要简单的add/remove来将事件添加到event loop中,通过event_dispatch驱动event。
Libevent支持 /dev/poll, kqueue(2), select(2), poll(2),
epoll(4), and evports。内部的事件机制和应用接口相互独立,因此内部实现的更新不影响应用程序。Libevent可以用于多线程。
安装
在官网下载http://libevent.org。我下载了最新版本libevent-2.0.22-stable.tar.gz。放到目录,解压缩tar -zxvf ibevent-2.0.22-stable.tar.gz。
解压后进入目录,进行配置,把库安装到/usr目录下
./configure --prefix=/usr
编译安装
sudo makesudo make install
查看是否安装成功:
ls -al /usr/lib|grep libeventlrwxrwxrwx 1 root root 21 8月 11 00:04 libevent-2.0.so.5 -> libevent-2.0.so.5.1.9-rwxr-xr-x 1 root root 920932 8月 11 00:04 libevent-2.0.so.5.1.9-rw-r--r-- 1 root root 1309268 8月 11 00:04 libevent.alrwxrwxrwx 1 root root 26 8月 11 00:04 libevent_core-2.0.so.5 -> libevent_core-2.0.so.5.1.9-rwxr-xr-x 1 root root 557242 8月 11 00:04 libevent_core-2.0.so.5.1.9-rw-r--r-- 1 root root 821804 8月 11 00:04 libevent_core.a-rwxr-xr-x 1 root root 974 8月 11 00:04 libevent_core.lalrwxrwxrwx 1 root root 26 8月 11 00:04 libevent_core.so -> libevent_core-2.0.so.5.1.9lrwxrwxrwx 1 root root 27 8月 11 00:04 libevent_extra-2.0.so.5 -> libevent_extra-2.0.so.5.1.9-rwxr-xr-x 1 root root 379504 8月 11 00:04 libevent_extra-2.0.so.5.1.9-rw-r--r-- 1 root root 487536 8月 11 00:04 libevent_extra.a-rwxr-xr-x 1 root root 981 8月 11 00:04 libevent_extra.lalrwxrwxrwx 1 root root 27 8月 11 00:04 libevent_extra.so -> libevent_extra-2.0.so.5.1.9-rwxr-xr-x 1 root root 939 8月 11 00:04 libevent.lalrwxrwxrwx 1 root root 29 8月 11 00:04 libevent_openssl-2.0.so.5 -> libevent_openssl-2.0.so.5.1.9-rwxr-xr-x 1 root root 90317 8月 11 00:04 libevent_openssl-2.0.so.5.1.9-rw-r--r-- 1 root root 110340 8月 11 00:04 libevent_openssl.a-rwxr-xr-x 1 root root 1010 8月 11 00:04 libevent_openssl.lalrwxrwxrwx 1 root root 29 8月 11 00:04 libevent_openssl.so -> libevent_openssl-2.0.so.5.1.9lrwxrwxrwx 1 root root 30 8月 11 00:04 libevent_pthreads-2.0.so.5 -> libevent_pthreads-2.0.so.5.1.9-rwxr-xr-x 1 root root 20571 8月 11 00:04 libevent_pthreads-2.0.so.5.1.9-rw-r--r-- 1 root root 14322 8月 11 00:04 libevent_pthreads.a-rwxr-xr-x 1 root root 1002 8月 11 00:04 libevent_pthreads.lalrwxrwxrwx 1 root root 30 8月 11 00:04 libevent_pthreads.so -> libevent_pthreads-2.0.so.5.1.9lrwxrwxrwx 1 root root 21 8月 11 00:04 libevent.so -> libevent-2.0.so.5.1.9
例子
写各测试程序,编译时要设置参数-levent,连接libevent的库。
echoServer.cc
#include <sys/socket.h>#include <sys/types.h>#include <netinet/in.h>#include <stdio.h>#include <string.h>#include <event.h>#include <stdlib.h>#include <unistd.h>#define PORT 8000#define BACKLOG 5#define MEM_SIZE 1024struct event_base* base;struct sockEvent{ struct event* readEvent; struct event* writeEvent; char* buffer;};void releaseSockEvent(struct sockEvent* ev)//delete from base and free it{ event_del(ev->readEvent); free(ev->readEvent); free(ev->writeEvent); free(ev->buffer); free(ev);}void handleWrite(int sock, short event, void* arg){ char* buffer = (char*)arg; send(sock, buffer, strlen(buffer), 0); free(buffer);}void handldRead(int sock, short event, void* arg){ struct event* writeEvent; int size; struct sockEvent* ev = (struct sockEvent*)arg; ev->buffer = (char*)malloc(MEM_SIZE); bzero(ev->buffer, MEM_SIZE); size = recv(sock, ev->buffer, MEM_SIZE, 0); printf("receive data:%s, size:%d\n", ev->buffer, size); if (size == 0) //client has send FIN { releaseSockEvent(ev); close(sock); return; } //add event to base to send the received data event_set(ev->writeEvent, sock, EV_WRITE, handleWrite, ev->buffer); event_base_set(base, ev->writeEvent); event_add(ev->writeEvent, NULL);}void handleAccept(int sock, short event, void* arg)//when new connection coming, calling this func{ struct sockaddr_in cli_addr; int newfd; socklen_t sinSize; struct sockEvent* ev = (struct sockEvent*)malloc(sizeof(struct sockEvent)); ev->readEvent = (struct event*)malloc(sizeof(struct event)); ev->writeEvent = (struct event*)malloc(sizeof(struct event)); sinSize = sizeof(struct sockaddr_in); newfd = accept(sock, (struct sockaddr*)&cli_addr, &sinSize); //set the new coming connection event event_set(ev->readEvent, newfd, EV_READ|EV_PERSIST, handldRead, ev); event_base_set(base, ev->readEvent); event_add(ev->readEvent, NULL);}int main(int argc, char* argv[]){ struct sockaddr_in serverAddr; int sock; sock = socket(AF_INET, SOCK_STREAM, 0); int on = 1; setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int)); //memset(&serverAddr, 0, sizeof(serverAddr)); bzero(&serverAddr, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(PORT); serverAddr.sin_addr.s_addr = INADDR_ANY; bind(sock, (struct sockaddr*)&serverAddr, sizeof(struct sockaddr)); listen(sock, BACKLOG); struct event listenEvent; base = event_base_new();//Create new EventBase event_set(&listenEvent, sock, EV_READ|EV_PERSIST, handleAccept, NULL);//conbine listenEvent and it's callback function event_base_set(base, &listenEvent); event_add(&listenEvent, NULL); event_base_dispatch(base);//start base return 0;}
0 0
- libevent源代码分析-介绍、安装、使用
- libevent源代码分析--buffer的使用
- libevent源代码分析--libevent核心event
- Libevent源代码分析笔记一,初见libevent
- libevent源代码分析--libevent核心event
- libevent-1.1a源代码分析
- libevent源代码分析之优先级
- libevent介绍和安装
- Libevent源代码分析笔记二,初始化
- libevent源代码分析--event_dispatch() (一)
- libevent源代码分析——event_dispatch() (二)
- libevent源码分析之源代码文件组织
- Libevent学习:介绍与安装
- 读libevent源代码-为何要使用syscall
- libevent介绍
- libevent介绍
- libevent介绍
- libevent介绍
- Spring3.0+Struts2.2+Hibernate3.6整合与常见问题
- 负载均衡方案总结
- Android Studio导入第三方类库的方法
- c中字符串分割函数strtok
- [Elasticsearch] 数据建模 - 处理关联关系(1)
- libevent源代码分析-介绍、安装、使用
- 数据结构 字符串二分查找正确实现
- bzoj 1047
- 避免进度调整失误
- 核电站
- DataGridView和DataTable的使用
- [机器学习]逻辑回归,Logistic regression |分类,Classification
- 装饰者模式
- 开发杂记