首页 > 其他 > 详细

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

时间:2020-06-23 10:31:44      阅读:125      评论:0      收藏:0      [点我收藏+]

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!