开源网络库实现服务端程序
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
2.https://dist.libuv.org/dist/
3.wget http://libuv.org/dist/v0.11.22/libuv-v0.11.22.tar.gz
4../autogen.sh
5.yum -y install automake
6.yum -y install libtool
7.yum -y install ncurses-devel
8../configure --prefix=/usr/local/libuv
9.make && make install
10.vim ~/.bashrc
11.source ~/.bashrc
12.pkg-config --libs --cflags libuv
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.服务端实现
1 /** 2 tcpserver.c 3 */ 4 #include <stdio.h> 5 #include <strings.h> 6 #include <unistd.h> 7 #include <event2/listener.h> 8 #include <event2/bufferevent.h> 9 #include <event2/buffer.h> 10 #include <arpa/inet.h> 11 12 #define PORT 8111 13 14 void on_read_cb(struct bufferevent* bev, void* ctx) 15 { 16 struct evbuffer* input = NULL; 17 struct evbuffer* output = NULL; 18 input = bufferevent_get_input(bev); 19 output = bufferevent_get_output(bev); 20 evbuffer_add_buffer(output, input); 21 } 22 23 void on_accept_cb(struct evconnlistener* listener, 24 evutil_socket_t fd, 25 struct sockaddr* addr, 26 int socklen, 27 void* ctx) 28 { 29 printf("connection[%d] accepted\n", fd); 30 struct event_base* base = NULL; 31 struct bufferevent* bev = NULL; 32 33 base = evconnlistener_get_base(listener); 34 bev = bufferevent_socket_new(base, fd, 0); 35 36 bufferevent_enable(bev, EV_READ | EV_WRITE); 37 bufferevent_setcb(bev, on_read_cb, NULL, NULL, NULL); 38 } 39 40 int main(int argc, char* argv[]) 41 { 42 struct sockaddr_in serv_addr; 43 struct event_base* base = NULL; 44 struct evconnlistener* listener = NULL; 45 base = event_base_new(); 46 47 bzero(&serv_addr, sizeof(serv_addr)); 48 serv_addr.sin_family = AF_INET; 49 serv_addr.sin_port = htons(PORT); 50 serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); 51 listener = evconnlistener_new_bind( 52 base, 53 on_accept_cb, 54 NULL, 55 LEV_OPT_REUSEABLE, 56 10, 57 (struct sockaddr *)&serv_addr, 58 sizeof(serv_addr)); 59 if (listener == NULL) { 60 printf("create socket listener failed.\n"); 61 _exit(-1); 62 } 63 64 printf("listening on port[%d]\n", PORT); 65 66 event_base_dispatch(base); 67 68 return 0; 69 } 70 71 # gcc -std=c11 -g -o tcpserver tcpserver.c `pkg-config --libs --cflags libevent` 72 # ./tcpserver