Libevent 简介

Libevent是一款事件驱动的网络开发包,由于采用C语言开发体积小巧,跨平台,速度极快。大量开源项目使用了Libevent比如谷歌的浏览器和分布式的高速缓存系统memcachedlibevent支持kqueue,select,poll,epoll,iocp。内部事件机制完全独立于公开事件APIlibevent支持跨平台可以在Linux*BSDMacOSX,Solaris,Windows等平台上编译。

学习条件:具有一定的C/C++基础,熟悉Linux

环境搭建

  • 配置zlib
# 1. 解压zlib 1.2.11
tar xvf zlib-1.2.11.tar.gz
# 2. 编译
cd zlib-1.2.11/
./configure
make
make install
  • 配置openssl
# 1. 解压openssl-1.1.1.tar.gz
tar xvf openssl-1.1.1.tar.gz
# 2. 编译
cd openssl-1.1.1/
./configure
make
make install
  • 配置libevent环境
# 1.加压liebevent 2.1.8
unzip libevent-master.zip
# 2. 编译
cd libevent-master/
./autogen.sh
./configure
make
make install
# 3.将动态路来连接到 /usr/lib 下或者执行以下  ldconfig
sudo ln -s /usr/local/lib/libevent-2.2.so.1 /usr/lib/libevent-2.2.so.1

实战实例

创建event_base

仅仅实现创建上下文

/****  创建event base* */#include <event2/event.h>
#include <iostream>
using namespace std;
int main()
{std::cout << "test libevent!\n"; //创建libevent的上下文event_base * base = event_base_new();if (base){cout << "event_base_new success!" << endl;}return 0;
}

创建test_server

test_server中说明了如何使用libevent创建一个socket监听

evconnlistener_new_bind一个接口完成了socket的创建,绑定和监听。

/****  创建event base* */#include <event2/event.h>
#include <iostream>
#include <signal.h>
#include <event2/listener.h>
#include <string.h>
#include "event_interface.h"using namespace std;/**A callback that we invoke when a listener has a new connection.@param listener The evconnlistener@param fd The new file descriptor@param addr The source address of the connection@param socklen The length of addr@param user_arg the pointer passed to evconnlistener_new()*/
void listen_cb(struct evconnlistener * evConnListener, evutil_socket_t evUtilSockFd, struct sockaddr * sockAddr, int socklen, void *data)
{cout << "listen cb is called" << endl;
}int main(int argc, char *argv[])
{//1. 忽略管道信号,发送数据给已关闭的socket//一些socket程序莫名宕掉的原因if(signal(SIGPIPE, SIG_IGN) == SIG_ERR){cout << "ignal pipe signal" << endl;}std::cout << "test libevent!\n"; //创建libevent的上下文event_base * base = event_base_new();if (!base){cout << "event_base_new failed." << endl;return -1;}else{cout << "event_base_new success!" << endl;}//监听端口//socket, bind, listensockaddr_in sockIn;memset(&sockIn, 0, sizeof(sockIn));sockIn.sin_family = AF_INET;sockIn.sin_port = htons(SERVER_PORT);/* 地址没有指定因为对sockIn进行了了memset,地址赋值为0代表着可以为任意可以用的地址 */struct evconnlistener *pEvListener = evconnlistener_new_bind(base, /* libevent的上下文 */listen_cb, /* 接收到连接的回调 */base, /* 回调函数参数 */LEV_OPT_REUSEABLE|LEV_OPT_CLOSE_ON_FREE, /* 地址重用,evconnlistenner关闭同时关闭socket */10, /* 连接队列的大小,对应的listen函数 */(sockaddr *)&sockIn,   /* 绑定地址和端口 */sizeof(sockIn));//事件分发处理if(base)event_base_dispatch(base);if(pEvListener)evconnlistener_free(pEvListener);if(base)event_base_free(base);return 0;
}

创建test_conf

test_conf主要是实现了,测试当前系统中支持的方法类型和事件特征的支持情况。

support methods
epoll
poll
selectEV_FEATURE_ET events are supported.
EV_FEATURE_O1 events are supported.
EV_FEATURE_FDS events are not supports.
EV_FEATURE_EARLY_CLOSE events are supported.
event base new with config sucess
#include <event2/event.h>
#include <event2/thread.h>
#include <event2/listener.h>
#include <signal.h>
#include <iostream>
#include <string.h>
#include "event_interface.h"using namespace std;int main()
{//忽略管道信号,发送数据给已关闭的socketif (signal(SIGPIPE, SIG_IGN) == SIG_ERR)return 1;//创建配置上下文event_config *config = event_config_new();//显示支持的网络模式const char **methods =   event_get_supported_methods();cout << "support methods " << endl;for(int i = 0; methods[i] != NULL; i++){cout << methods[i] << endl;}//设置特征,确认特征时候生效//这个features在linux中设置没有效果,因为linux中本来就是支持ET模式的,边缘触发模式// 设置了EV_FEATURE_FDS其他特征嗯就无法设置//也就是所支持了EV_FEATURE_FDS  其他的特征都是无法支持的int ret = event_config_require_features(config, EV_FEATURE_ET|EV_FEATURE_EARLY_CLOSE);if(OK != ret){cerr << "event config require features failed." << endl;return ERROR; }//初始化libevent上下文event_base *base =  event_base_new_with_config(config);//config一旦配置好就不需要在使用了event_config_free(config);if(!base){cerr << "event base new with config failed!" << endl;//首次失败就创建一个base取默认值,若是再次失败就返回失败base = event_base_new();if(!base){cerr << "event base new failed." << endl;   return ERROR;}}else{//确认特征那些生效int f = event_base_get_features(base);if(f&EV_FEATURE_ET){cout << "EV_FEATURE_ET events are supported." << endl;}else{cout << "EV_FEATURE_ET events are not supports." << endl;}if(f&EV_FEATURE_O1){cout << "EV_FEATURE_O1 events are supported." << endl;}else{cout << "EV_FEATURE_O1 events are not supports." << endl;}if(f&EV_FEATURE_FDS){cout << "EV_FEATURE_FDS events are supported." << endl;}else{cout << "EV_FEATURE_FDS events are not supports." << endl;}if(f&EV_FEATURE_EARLY_CLOSE){cout << "EV_FEATURE_EARLY_CLOSE events are supported." << endl;}else{cout << "EV_FEATURE_EARLY_CLOSE events are not supports." << endl;}cout << "event base new with config sucess" << endl;event_base_free(base);}return 0;
}

Libevent事件的创建-scoke服务的创建-特征的获取和配置相关推荐

  1. 【创建微服务】创建微服务并使用人人开源代码生成器生成基本代码

    创建项目微服务 -- 添加模块 添加依赖 使用 人人开源代码生成器 快速生成 crud 代码 -- https://gitee.com/renrenio 下载导入人人开源项目后,修改 applicat ...

  2. 用.NET创建Windows服务

    用.NET创建Windows服务 译者说明:我是通过翻译来学习C#的,文中涉及到的有Visual Studio.NET有关操作,我都根据中文版的VS.NET显示信息来处理的,可以让大家不致有误解. 作 ...

  3. 用C#创建Windows服务(Windows Services)

    转载自 hyslove 最终编辑 hyslove Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是 ...

  4. 杂记2:VS2013创建Windows服务实现自动发送邮件

    这篇随笔里,我将介绍如何用VS2013开发Windows服务项目,实现的功能是定时发送电子邮件. 开发环境:VS2013,SQL Server2008,采用C#语言开发 步骤一:创建Windows服务 ...

  5. netty 5 alph1源码分析(服务端创建过程)

    研究了netty的服务端创建过程.至于netty的优势,可以参照网络其他文章.<Netty系列之Netty 服务端创建>是 李林锋撰写的netty源码分析的一篇好文,绝对是技术干货.但抛开 ...

  6. *用C#创建Windows服务(Windows Services)

    Windows服务在Visual Studio 以前的版本中叫NT服务,在VS.net启用了新的名称.用Visual C# 创建Windows服务不是一件困难的事,本文就将指导你一步一步创建一个Win ...

  7. C#创建windows服务并定时执行

    一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...

  8. C# 创建Windows服务。服务功能:定时操作数据库

    一.创建window服务 1.新建项目-->选择Windows服务.默认生成文件包括Program.cs,Service1.cs 2.在Service1.cs添加如下代码: System.Tim ...

  9. 如何给Android应用创建本地服务

    Android系统给应用提供了两种类型的服务:启动型本地服务和绑定型本地服务,这两种服务的详细信息请参考"Android Service开发指南" Android Service开 ...

最新文章

  1. mysql 和 sqlite 区别 及 SQLite Expert Professional sqliteManager 区别
  2. 最大流自用模板(例题:HDU1532)
  3. golang chan 探究
  4. 左对齐杨辉三角python_python实现杨辉三角思路
  5. 从rpm包中提取文件的命令
  6. 【Android】魅族Flyme OS 3摄像头无法预览的问题
  7. 代码管理学:命名要准确
  8. 如何把大写金额变为小写数字_如何将小写金额转换为大写金额?这几个公式你至少要学会一个……...
  9. 2022年招商团长未来两年发展趋势分析
  10. 对List集合嵌套了map集合的排序
  11. sketch和zeplin
  12. Linux Ubuntu20.10 安装Process Monitor(Procmon),以及使用方法
  13. JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)
  14. 《歌剧魅影》(Phantom of the Opera)
  15. 做网站注意事项,网站建设标准流程
  16. NASA开始调试校准韦伯望远镜18面金色镜子,需三个月
  17. 青蛙跳水杯(蓝桥杯)--宽度优先搜索
  18. java:泛型(自定义泛型类、自定义泛型接口、泛型的继承和通配符说明)
  19. hbase 重启regionserver报错 Call queue is full on xxxx,16000,1611197476326, too many items queued
  20. 水波加载动画 html+css

热门文章

  1. linux distribution timeline
  2. 详尽解析window.event对象
  3. hdu 1147(线段相交)
  4. Properties类的应用
  5. css实现超出文本溢出用省略号代替
  6. Arduino LiquidCrystal库函数中文对照
  7. Thinkphp5.1依赖注入、容器、闭包的注入
  8. IDA Pro的patch插件 KeyPatch
  9. 《第一行代码》学习笔记40-网络(1)
  10. 多线程中Local Store Slot(本地存储槽)[转]