开源网络库实现服务端程序

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

 

posted @ 2020-06-23 01:12  sp0917  阅读(213)  评论(0编辑  收藏  举报