1.几个开源网络库
1.libevent(类比epoll)
1.http://libevent.org/
2.wget -c addr --no-check-certificate
3../configure --prefix=/usr/local/libevent
4.make && make install
5.vim ~/.bashrc
6.source ~/.bashrc
7.pkg-config --libs --cflags libevent
2.libevthp
1.http库
2.基础库为libevent
3.libuv
1.libuv+V8引擎构成node.js
4.libev
1.为了改善libevent;
2.只支持linux;
2.libevent对比epoll
1.event_base_new() => epoll_create()
2.event_base_dispatch() => epoll_wait()
3.event_new() => epoll_ctl()
4.event_add() => epoll_ctl()
5.event_del() => epoll_ctl()
6.event_free() => epoll_ctl()
3.libevent关键api
1 /** 2 @lib libevent 3 @file listener.h 4 @function evconnlistener_new_bind() 5 */ 6 7 /** 8 Allocate a new evconnlistener object to listen for incoming TCP connections 9 on a given address. 10 11 @param base The event base to associate the listener with. 12 @param cb A callback to be invoked when a new connection arrives. If the 13 callback is NULL, the listener will be treated as disabled until the 14 callback is set. 15 @param ptr A user-supplied pointer to give to the callback. 16 @param flags Any number of LEV_OPT_* flags 17 @param backlog Passed to the listen() call to determine the length of the 18 acceptable connection backlog. Set to -1 for a reasonable default. 19 @param addr The address to listen for connections on. 20 @param socklen The length of the address. 21 */ 22 struct evconnlistener* 23 evconnlistener_new_bind( 24 struct event_base *base, 25 evconnlistener_cb cb, 26 void *ptr, 27 unsigned flags, 28 int backlog, 29 const struct sockaddr *sa, 30 int socklen); 31 32 /** 33 A callback that we invoke when a listener has a new connection. 34 35 @param listener The evconnlistener 36 @param fd The new file descriptor 37 @param addr The source address of the connection 38 @param socklen The length of addr 39 @param user_arg the pointer passed to evconnlistener_new() 40 */ 41 typedef void (*evconnlistener_cb)( 42 struct evconnlistener *, 43 evutil_socket_t, 44 struct sockaddr *, 45 int socklen, 46 void *);
1.bufferevent的作用
1.从外面看,它就是一个缓冲区,可以与socket绑定
2.内部由输入和输出缓冲区组成
3.每一个socket对应一个bufferevent
4.当socket有事件触发时,可以设置回调函数
4.服务端实现
/** event_driven.c */ #include <stdio.h> #include <strings.h> #include <event2/listener.h> #include <event2/bufferevent.h> #include <event2/buffer.h> #include <arpa/inet.h> #define PORT 8111 void on_read_cb(struct bufferevent* bev, void* ctx) { struct evbuffer* input = NULL; struct evbuffer* output = NULL; input = bufferevent_get_input(bev); output = bufferevent_get_output(bev); evbuffer_add_buffer(output, input); } void on_accept_cb(struct evconnlistener* listener, evutil_socket_t fd, struct sockaddr* addr, int socklen, void* ctx) { printf("connection[%d] accepted\n", fd); struct event_base* base = NULL; struct bufferevent* bev = NULL; base = evconnlistener_get_base(listener); bev = bufferevent_socket_new(base, fd, 0); bufferevent_enable(bev, EV_READ | EV_WRITE); bufferevent_setcb(bev, on_read_cb, NULL, NULL, NULL); } int main(int argc, char* argv[]) { struct sockaddr_in serv_addr; struct event_base* base = NULL; struct evconnlistener* listener = NULL; base = event_base_new(); bzero(&serv_addr, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(PORT); serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); listener = evconnlistener_new_bind( base, on_accept_cb, NULL, LEV_OPT_REUSEABLE, 10, (struct sockaddr *)&serv_addr, sizeof(serv_addr)); if (listener != NULL) { printf("listening on port[%d]\n", PORT); } event_base_dispatch(base); return 0; } # gcc -std=c11 -g -o event_driven event_driven.c `pkg-config --libs --cflags libevent` # ./event_driven
原文:https://www.cnblogs.com/sip-inaction/p/13179909.html