当前位置:   article > 正文

libevent简要介绍

libevent
libevent库
        开源。精简。跨平台(Windows、Linux、Maxos、unix)。专注于网络通信。
源码包安装:
        ./configure                    检查安装环境  生成makefile
        make                                生成.o和可执行文件
        sudo  make  install        将必要的资源cp至系统指定目录。
        进入sample目录,运行demo验证库安装使用情况。
        编译使用库的.c时,需要加-levent选项。
        库名libevent.so--> /usr/local/lib    查看得到。
特性:
        基于“事件”异步通信模型。---回调。
libevent框架:
      1.  建event_base        (乐高底座)
                struct event_base *event_base_new(void);
                struct event_base *event *base=event_base_new();
        2.  创建 事 件event
                    常规事件 event    -->event_new();
                    bufferevent -->bufferevnet_socket_new();
         3. 将事件  添加到base上
                    int event_add(struct event *ev,const struct timeval *tv);
         4. 循环监听事件满足
                    int event_base_dispatch(struct event_base *base);
                                event_base_dispatch(base);
       5. 释放 event_base
                    event_base_free(base);
创建事件:
  1. struct event *ev;
  2. struct event *evennt_new(struct event_base *base,evutil_socket_t fd,short what,event_callback_fn cb;void *arg);
  3.         base:event_base_new()返回值。
  4.         fd :绑定到event上的 文件描述符。
  5.         what:对应的事件(r、w、e)
  6.                 EV_READ            一次  读事件
  7.                 EV_WRTIE           一次 写事件
  8.                 EV_PERSIST        持续触发。结合event_base_dispatch函数使用,生效。
  9.         cb:一旦事件满足监听条件,回调的函数。
  10.         typedef void(*event_callback_fn)(evutil_socket_t fd, short,void *)
  11.         arg:回调函数的参数。
  12.         返回值:成功创建的 event

添加事件到event_base
  1. int event_add(struct event *ev,const struct timeval *tv);
  2.      ev: event_new()的返回值。
  3.      tv:NULL

从event_base上摘下事件                【了解】
  1. int event_del(struct event *ev);
  2.     ev:event_new()的返回值。

销毁事件:       
  1. int event_free(struct event *ev);
  2.     ev:event_new()的返回值。

未决和非未决:
        非未决:没有资格被处理
        未决:有资格被处理,但尚未被处理
        event_new--->event---->非未决--->event_add--->未决--->dispatch()&&监听事件被触发-->激活态
                ——>执行回调函数--->处理态--->非未决 event_add && EV_PERSIST---->未决--->event_del--->非未决
带缓冲区的事件 bufferevent
       
 #include<event2/buffereevent.h>
创建、销毁bufferevent 
  
  1. struct bufferent *ev;
  2. struct bufferevent *bufferevent_socket_new(struct event_base *base,evutil_socket_t fd,enum bufferevent_options options);
  3.         base:    event_base
  4.         fd:    封装到bufferevent内的fd
  5.         options:    BEV_OPT_CLOSE_ON_FREE
  6. 返回:成功创建的bufferevent事件对象。
  7. void bufferevent_socket_free(struct bufferevent *ev);
给bufferevent设置回调:
  1. 对比event:event_new(fd,callback);            event_add() --- 挂到event_base上。
  2.                     bufferevent_socket_new(fd)        bufferevent_setcb(callback)
  3. void bufferevent_setcb(struct bufferevent*bufev, bufferevent_data_cb reacb, bufferevent_data_cb writecb, bufferevent_data_cb eventcb , void *cbarg );
  4. bufev:bufferevent_socket_new()返回值
  5. readcb:设置bufferevent 度缓冲,对应回调 read_cb{     bufferevent_read()  读数据   }
  6. writecb:设置bufferevent 写缓冲,对应回调write_cb{    } ---给调用者,发送写成功通知。    可以NULL
  7. eventcb:设置事件回调。    也可以传NULL
  8.             typedef void(*bufferevent_data_cb)(struct bufferevent *bev,void*ctx);
  9.             void event_cb(struct bufferevent *bev, short events, void *cbarg)
  10.             {
  11.                 。。。。。
  12.             }
  13. cbarg:上述回调函数使用的参数。
  14. read    回调函数类型:
  15.             typedef void(*bufferevent_data_cb)(struct bufferevent *bev,void*ctx);
  16.             void read_cb(struct bufferevent *bev,void *cbarg)
  17.             {
  18.                 .....
  19.                 bufferevent_read();    ---read()
  20.             }
  21. bufferevent_read()函数的原型:
  22.             size_t bufferevent_read(struct bufferevent *bev, void *buf, size_t bufsize);
  23. write 回调函数类型:
  24.             int bufferevent_write(struct bufferevent *bufev, const void*data,size_t size);
启动、关闭bufferevent的 缓冲区:
  1.  void bufferevent_enable(struct bufferevent *bufev, short events);    启动
  2.       events:    EV_READ、EV_WRITE、EV_READ|EV_WRITE
  3.       默认、write 缓冲区 enable、read缓冲区是disable
  4.       bufferent_enable(event,EV_READ);            --开启读缓冲

创建监听服务器:
  1. socket();bind();listen();accept();
  2. struct evconnlistener *listner
  3. struct evconnlistener *evconnlistener_new_bind(
  4.     struct event_base *base,
  5.     evconnlistener_cb cb,
  6.     void *ptr,
  7.     unsigned flags,
  8.     int backlog,
  9.     const struct sockaddr *sa,
  10.     int socklen);
  11. base:event_base
  12. cb:回调函数。    一旦被回调,说明在其内部应该与客户端完成,数据读写操作,进行通信。
  13. ptr:回调函数的参数
  14. flags:LEV_OPT_CLOSE_ON_FREE |  LEV_OPT_REUSEABLE
  15. backlog:listen() 2参。    -1表最大值
  16. sa:服务器自己的地址结构体
  17. socklen:服务器自己的地址结构体大小。
  18. 返回值:成功创建的监听器。
连接客户端:
  1. socket();    connect();
  2. int bufferevent_socket_connect(struct bufferevent *bev, struct sockaddr *address, int addrlen);
  3.         bev:bufferevent 事件对象(封装了fd)
  4.         address、len:等同于connect()参2/3

服务器端libevent创建TCP连接:
  • 1.创建event_base
  • 2.创建bufferevent事件对象。bufferevent_socket_new();
  • 3.使用bufferevent_setcb()函数给bufferevent的read、write、event设置回调函数。
  • 4.当监听的事件满足时,read_cb会被调用,在其内部bufferevent_read();    读
  • 5.使用evconnlistener_new_bind创建监听服务器,设置其回调函数,当有客户端成功连接时,这个回调函数会被调用。
  • 6.封装listner_cb()在函数内部。完成与客户端通信。
  • 7.设置读缓冲、写缓冲的 使能状态 enable、disable
  • 8.启动循环event_base_dispath();
  • 9.释放连接
客户端libevent创建TCP连接:
  • 1.创建event_base
  • 2.使用bufferevent_socket_new()创建一个用跟踪服务器通信的bufferevnet事件对象
  • 3.使用bufferevent_socket_connect()连接 服务器
  • 4.使用bufferevent_setcb()给bufferevnet对象的read、write、event设置回调
  • 5.设置bufferenet对象的读写缓冲区enable/disable
  • 7.启动循环event_base_dispath();
  • 8.释放连接

web——HTTP请求协议:
  • 1.getline()获取http协议的第一行。
  • 2.从首行中拆分    GET、文件名、协议版本。获取用户请求的文件名。
  • 3.判断文件是否存在。stat()
  • 4.判断是文件还是目录。
  • 5.是文件--open--read --写会给浏览器
  • 6.先写http应答协议头:http/1.1 200 ok
  • 7.写文件数据。

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/458464
推荐阅读
相关标签
  

闽ICP备14008679号