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


    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
    ", 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.
    ");
    61         _exit(-1);
    62     }
    63 
    64     printf("listening on port[%d]
    ", 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
  • 相关阅读:
    os模块
    自定义模块--->可执行文件
    VSCode同步插件Sync
    Django之模板
    十:索引+慢查询
    八分组查询
    (一)Django之虚拟环境
    二:Anaconda的使用
    Python之数据类型
    Python零散知识点
  • 原文地址:https://www.cnblogs.com/sip-inaction/p/13179909.html
Copyright © 2020-2023  润新知