• Libevent源码学习笔记一:event2/event.h


    一、libevent标准使用方法:

      每个程序使用Libevent必须include <event2/event.h> 头文件,并 传给 -levent  链接器。如果只是想使用主要的event和buffered IO-based code,不想链接任何协议代买,使用链接 -levent_core。

    二、安装库设置

      在调用Libevent其他函数时,需要设置库。例如在应用中使用多线程,需要先初始化线程支持,使用evthread_use_pthreads() or evthread_use_windows_threads().在<event2/thread.h>获取更多信息。

      另外,可以使用event_set_mem_functions来替换Libevent 内存管理,想要测试 debug,使用event_enable_debug_mode().

    三、 创建event base

      Libevent是反应器(Reactor)模式,event_base就相当于反应器,event_base 负责监视event是等待状态还是就绪状态,每个event与一个event_base关联。

    四、事件通知机制

      一个文件描述符对应一个event结构体,可以使用event_new()来创建一个event结构体,或者是声明一个event structure,然后使用event_assign()来初始化event的成员。为了实现通知,使用event_add()来将事件添加到列表。只要事件是活动的,事件结构必须保持分配,因此它一般应该在堆上分配。

    五、循环处理事件

      最后调用event_base_dispatch() 来循环处理事件。也可以使用event_base_loop 来实现更细致的控制。

      一个线程只能处理一个event_base。If you want to run events in multiple threads at once, you can either have a single event_base whose events add work to a work queue,or you can create multiple event_base objects.

    六、bufferevent I/O Buffers 缓冲输入输出

      Libevent提供 一个 buffered I/O abstraction 在常规事件回调的顶部。这个abstraction 是 bufferevent。一个 bufferevent 提供自动填充和清理输入和输出缓冲。使用buffered event不再直接处理I/O,而是从输入缓冲读,输出缓冲区写。

      一旦通过bufferevent_socket_new()初始化,bufferevnet 结构体 通过bufferevent_enable()和bufferevent_diable()实现重复使用。以前是直接读写socket,使用bufferevent_socket后,改为使用bufferevent_read()和bufferevent_write()。

    读缓存水位分析:

    1、  bufferevent用于数据接收和发送缓存。

    2、  bufferevent内建了两个struct bufferevent对象,分别用于发送和接收缓存。

    3、  水位值用于实现对缓存区的管理。

    4、  从网络模型分析bufferevent会自动从socket读取数据缓存在bufferevent的接收缓存中。

    5、  当bufferevent存储的数据到达低水位值时读回调函数触发。

    6、  低水位是0时,只要bufferevent从网络收数据就会触发读回调,也即数据可以立即被用户读走。

    7、  读回调函数常规操作是从bufferevent中读取数据(用户读取数据)。

    8、  但是当bufferevent读取的速度大于用户从bufferevent读取速度是,bufferevent中的数据量会达到高水位值。

    9、  当bufferevent缓存数据量达到高水位值时,bufferevent会停止从网络接收数据。

    10、当用户从bufferevent中读取了数据使水位值低于高水位值时,bufferevent又可以从网络中接收新的数据。

     

    写缓存水位分析:

    1、  用户先将数据写入到bufferevent发送缓存。

    2、  当bufferevent发送缓存存储的数据量达到低水位时,回调函数将被触发。

    3、  当低水位为0时,bufferevent缓存为空,写进数据时写回调被触发。

    4、  回调函数的常规操作是将bufferevent发送缓存数据写到网络中。

    5、  当用户写入发送缓存数据快于回调函数将数据写到网络中时,水位值将达到高水位值。

    6、  高水位值没有使用。

    七、定时器

      Libevent可以创建定时器来当超时时来调用回调函数。evtimer_new() 宏 返回一个使用定时器的event。为了激活定时器,调用evtimer_add()宏。可以使用evtimer_del()使用定时器失活。

    这些宏使用对event_new(),event_add(),event_del的包装。

    八、evdns Asynchronous DNS resolution 异步DNS解决方案

    Libevent 提供一个异步DNS来替代标准的DNS解决器。在<event2/dns.h>有更多函数

    九、evhttp event-driven HTTP servers

    Libevent提供一个非常简单事件驱动的HTTP服务器,可以集成到程序中并处理HTTP请求

    <event2/http.h>

    十、evrpc  A framework for RPC servers and clients

    Libevent provides a framework for creating RPC servers and clients. It takes care of marshaling and unmarshaling all data structures.
    event2/event.h
    The primary libevent header

    十一、Libevent主要头文件

    1.event2/thread.h
    Functions for use by multithreaded programs

    2.event2/buffer.h and event2/bufferevent.h
    Buffer management for network reading and writing

    3.event2/util.h
    Utility functions for portable nonblocking network code

    4.event2/dns.h
    Asynchronous DNS resolution

    5.event2/http.h
    An embedded libevent-based HTTP server

    6.event2/rpc.h
    A framework for creating RPC servers and clients

    十二、event structure

    事件处理步骤:

      1.event_new()创建event

      2.event_add()将event添加到event_base中

      3.不再使用事件时,event_free()删除事件

    事件分为persistent和non-persistent。non-persistent事件,被触发后只执行一次,然后状态变为non-pending;persistent事件当被触发执行回调函数后,状态为pending然后在event_base继续等待执行,只用使用event_del()手动删除事件将状态改为non-pending。

  • 相关阅读:
    由保存当前用户引发的springboot的测试方式postman/restlet还是swagger2
    VS集成opencv编译C++项目遇到的问题
    利用StringUtils可以避免空指针问题
    springboot集成Guava缓存
    Oracle 课程四之索引
    Oracle 课程三之表设计
    Oracle 课程二之Oracle数据库逻辑结构
    Oracle 课程一之Oracle体系结构
    Oracle权限一览表
    Informatica元数据库解析
  • 原文地址:https://www.cnblogs.com/dj0325/p/8796076.html
Copyright © 2020-2023  润新知