Linux网络编程之libevent库用法

264 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 30 天,点击查看活动详情

一、libevent库

开源。精简。跨平台(Windows、Linux、maxos、unix)。专注于网络通信。

  • 源码包安装: 参考 README、readme

    ./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 *base = event_base_new();
    
  2. 创建 事件evnet

     常规事件 event	--> event_new(); 
    
     bufferevent --> bufferevent_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. 创建事件event

     struct event *ev;
    
     struct event *event_new(struct event_base *base,evutil_socket_t fd,short what,event_callback_fn cb;  void *arg);
    
     base: event_base_new()返回值。
    
      fd: 绑定到 event 上的 文件描述符
    
     what:对应的事件(r、w、e)
    
     	EV_READ		一次 读事件
    
     	EV_WRTIE	一次 写事件
    
     	EV_PERSIST	持续触发。 结合 event_base_dispatch 函数使用,生效。
    
     cb:一旦事件满足监听条件,回调的函数。
    
     typedef void (*event_callback_fn)(evutil_socket_t fd,  short,  void *)	
    
     arg: 回调的函数的参数。
          
     返回值:成功创建的 event    
    
  • 添加事件到 event_base

     int event_add(struct event *ev, const struct timeval *tv);
    
     ev: event_new() 的返回值。
    
     tv:NULL
    
  • 从event_base上摘下事件 【了解】

      int event_del(struct event *ev);
    
      ev: event_new() 的返回值。
    
  • 销毁事件

      int event_free(struct event *ev);
    
      ev: event_new() 的返回值。
    

四、未决和非未决

非未决: 没有资格被处理

未决: 有资格被处理,但尚未被处理

event_new --> event ---> 非未决 --> event_add --> 未决 --> dispatch() && 监听事件被触发 --> 激活态 --> 执行回调函数 --> 处理态 --> 非未决 event_add && EV_PERSIST --> 未决 --> event_del --> 非未决

事件的未决--非未决状态转换

image.png

五、数据传输协议

  • 请求协议: --- 浏览器组织,发送

    1. GET /hello.c Http1.1\r\n
    2. Host: localhost:2222\r\n
    3. User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:24.0) Gecko/201001 01 Firefox/24.0\r\n
    4. Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8\r\n
    5. Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3\r\n
    6. Accept-Encoding: gzip, deflate\r\n
    7. Connection: keep-alive\r\n
    8. If-Modified-Since: Fri, 18 Jul 2014 08:36:36 GMT\r\n

    【空行】\r\n

  • 应答协议:

    1. Http1.1 200 OK

    2. Server: xhttpd Content-Type:text/plain; charset=iso-8859-1

    3. Date: Fri, 18 Jul 2014 14:34:26 GMT

    4. Content-Length: 32 ( 要么不写 或者 传-1, 要写务必精确 ! )

    5. Content-Language: zh-CN

    6. Last-Modified: Fri, 18 Jul 2014 08:36:36 GMT

    7. Connection: close

      \r\n

    [数据起始。。。。。。。。。。。。数据终止]