使用libevent编写linux服务(一)

基于libevent的socket服务端开发【Linux】 Libevent是一个用C语言编写的、轻量级的开源高性能事件通知库,主要有以下几个特点:事件驱动,高性能;轻量级,专注于网络,不像ACE那么臃肿庞大;源代码相当精炼、易读;跨平台,支持Windows、Linux、*BSD和MacOs;支持多种I/O多路复用技术,如epoll,poll,dev/poll,select和kqueue等;支持I/O,定时器和信号等事件;注册事件优先级。 阅读详情

使用libevent编写linux服务(一)

一 libevent简介

libevent是一个支持Windows、linux和bsd等平台的网络事件驱动程序库。它支持多种I/O服用机制,按照优先级从高到低依次为:evport、kqueue、epoll、devpoll、rtsig、poll、select。它可根据操作系统,按照优先级从高到底自主选择驱动。

     用户可以通过http://www.monkey.org/~provos/libevent/来获取libevent的源码、libevent出现的背景、以及其他一些详细资料。

二 libevent的使用

1 初始化事件  

我们首先完成对libenvent的事件初始化和事件驱动模型的选择。(在使用多线程的情况下,一般我们需获取所返回的事件根基)

main_base = event_init();

  

event_init函数返回的是一个event_base对象,该对象包括了事件处理过程中的一些全局变量,其结构为:

struct event_base {
    const struct eventop *evsel;
    void *evbase;
    int event_count;        /* counts number of total events */
    int event_count_active; /* counts number of active events */

int event_gotterm;      /* Set to terminate loop */
    int event_break;        /* Set to terminate loop immediately */

    /* active event management */
    struct event_list **activequeues;
    int nactivequeues;

    /* signal handling info */
    struct evsignal_info sig;

    struct event_list eventqueue;
    struct timeval event_tv;

    struct min_heap timeheap;

    struct timeval tv_cache;
};

2 添加事件

        在事件初始化完毕后,我们可以使用event_set设置事件,然后使用event_add将其加入。

   这里我们首先完成socket的监听,然后将其加入的事件队列中(这里我们对所有的异常都不做考虑)。

(1)socket监听

struct sockaddr_in listen_addr;

int port = 10000; //socket监听端口

   int listen_fd = socket(AF_INET, SOCK_STREAM, 0);

   memset(&listen_addr, 0, sizeof(listen_addr));

    listen_addr.sin_family = AF_INET;
    listen_addr.sin_addr.s_addr = INADDR_ANY;
    listen_addr.sin_port = htons(port)

   reuseaddr_on = 1;

setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, &reuseaddr_on, sizeof(reuseaddr_on)) #支持端口复用

bind(listen_fd, (struct sockaddr *) &listen_addr, sizeof(listen_addr))'

listen(listen_fd, 1024);

/*将描述符设置为非阻塞*/

int flags = fcntl(listen_fd,, F_GETFL);

flags |= O_NONBLOCK;

fcntl(listen_fd, F_SETFL, flags);

(2)事件设置

      socket服务建立后,就可以进行事件设置。我们使用event_set来设置事件对象,其传入参数包括事件根基(event_base对象),描述符,事件类型,事件发生时的回调函数,回调函数传入参数。其中事件类型包括EV_READ、EV_WRITE、EV_PERSIST,EV_PERSIST和前两者结合使用,表示该事件为持续事件。

struct event ev;

event_set(&ev, listen_fd, EV_READ | EV_PERSIST, accept_handle, (void *)&ev);

(3)事件添加与删除

         事件设置好后,就可以将其加入事件队列。event_add用来将事件加入,它接受两个参数:要添加的事件和时间的超时值。 如果需要将事件删除,可以使用event_del来完成。event_del函数会取消所指定的事件。

event_add(&ev, NULL)

3 进入事件循环

    事件成功添加后就是万事具备只欠东风了,libevent提供了多种方式来进入事件循环,我个人常用的是event_dispatch和event_base_loop,前者最后实际是使用当前事件根基来调用event_base_loop。

   event_base_loop(main_base, 0);

linux c++使用libevent编写http server + http client http server: /* A trivial static http webserver using Libevent's evhttp. This is not the best code in the world, and it does some fairly stupid stuff that you would never want to do in a production 阅读详情

相关推荐

Linux下libevent库的使用

libevent1.libevent的好处2.libevent的使用3.libevent编写多线程 在了解了libevent的安装后,再来了解一下它的使用,特别是进行多线程的使用。其实这个最大的好处就是他在内部帮你封装好了epoll/select多路复用,并且使用了一些设计模式(比如反应堆模式),用事件机制来简化了socket编程然后要用的时候直接把相应的文件描述符加进去即可! 1.libevent的好处 假设有N个客户端同时往服务端通过socket写数据,用了libevent之后,你的server程序里

AJIEIT的博客 937

linux重启memcache_Linux系统安装 Memcached 服务详细讲解

Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。服务器端主要是安装memcache服务器端.下...

weixin_39553156的博客 185

libevent evhttp使用

一、libevent evhttp使用 1、基本流程 http服务端使用到的借口函数及流程如下 1)、创建event_base和evhttp struct event_base *event_base_new(void); struct evhttp *evhttp_new(struct event_base *base); 2)、绑定地址和端口 int evhttp_bind_socket(st...

深之JohnChen的专栏 4857

0. Libevent 基础概述

本节简单介绍一下Libevent的基础,并说明一下它的使用,后面将进行源码剖析。

qq_48056300的博客 1044

信息化建设项目前期方案编制4:如何画好四张图

这里探讨以下具体的总体设计操作层面的工作。总体设计主要是完成四张图,总体架构(逻辑架构)、应用架构、网络拓扑、系统部署图。对于一些单一的系统,往往总体架构和应用架构可以合一。网络拓扑画好了,系统部署图也可以省略。有些项目还会在这之外,有所谓的技术架构图。对应用系统、数据存储等各个部分各自用的主要技术、服务等,给出总体设计图。但通常来说,这四张图在一个中等规模(200~500万,软件...

Leonardo的博客 4636

Linux下Memcache 安装和使用

Memcached是一种高性能的分布式内存对象缓存系统(memcached虽然称为“分布式”缓存服务器,但服务器端并没有“分布式”功能,其“分布式”由客户端函数库完成,成熟算法的为一致性Hash),用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。很多大型网站都使用了Memcached做缓存。MemCache依赖于libev...

weixin_30399871的博客 118

信贷风控分析—征信数据源

详解企业和个人征信报告,以及信贷风控之指标构造案例参考

csdnbt的博客 3626

linux重启memcache_Linux下memcache的安装和启动(转)

memcache是高性能,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。据说官方所说,其用户包括twitter、digg、flickr等,都是些互联网大腕呀。目前用memcache解决互联网上的大用户读取是非常流行的一种用法。下载安装下载了,我到了其官方(http://memcached.org/),目前最新的下载版本是1.4.5还要再安装libevent这个软件,从官方...

weixin_39640520的博客 136

Windows 11 安装 MySQL 8.4:安装包方式、下载、安装、使用

本文详细介绍了在 Windows 11 系统下通过 MSI 安装包方式安装 MySQL 8.4 LTS 社区版的完整流程,包括版本选择、下载、自定义安装路径、服务配置、日志设置、示例数据库创建及后续使用方法。同时提供了命令行客户端与图形化工具 DBeaver 的连接与操作演示,适合初学者和开发者快速搭建本地 MySQL 开发环境。

寒水馨 · 轻量级技术文档 · hanshuixin.org 2257

2026年全球VCSEL芯片竞争格局揭秘:美欧亚“三足鼎立”,中国军团强势崛起

全球VCSEL芯片市场迎来爆发期,预计2032年规模将达110亿元。美国Lumentum、Coherent等巨头主导消费电子和光通信领域,欧洲ams-OSRAM、TRUMPF则在车规级高功率VCSEL占据优势。中国企业如长光华芯、纵慧芯光加速追赶,实现从3D传感向激光雷达的技术跨越。行业未来聚焦高功率、多结阵列化发展,自动驾驶和AI算力需求将推动市场持续增长,但面临技术壁垒、供应链依赖等挑战。国际巨头与中国厂商将在这一光芯片赛道展开激烈竞争。

致力于lidar应用开发 782

100万并发连接服务器笔记之处理端口数量受限问题

第二个遇到的问题:端口数量受限 一般来说,单独对外提供请求的服务不用考虑端口数量问题,监听某一个端口即可。但是向提供代理服务器,就不得不考虑端口数量受限问题了。当前的1M并发连接测试,也需要在客户端突破6万可用端口的限制。 单机端口上限为65536 端口为16进制,那么2的16次方值为65536,在linux系统里面,1024以下端口都是超级管理员用户(如root)才可以使用,普

记事本 4849

9篇2章2节:GBD 数据库的数据申请详解

无论您是初入公共卫生领域的学生、资深的科研工作者,还是政策决策者,GBD数据库都将成为您数据分析与决策支持中不可或缺的重要工具。

MD Code 2599

Linux:Libevent简单使用

文章目录一、什么是Libevent二、Libevent如何使用三、Libevent简单使用实例四、Libevent简单实现TCP服务器 一、什么是Libevent Libevent: 是开源社区的一款高性能的I/O框架库。 其学习和使用者众多,例如:高性能的分布式内存对象缓存软件memcached,Google浏览器Chromium的Linux版本。 Libevent使用特点: 1.跨平台支持: Libevent支持Linux,UINX和Windows。 2.统一事件源: Libevent对I/O事件、信号

Rain的博客 2265

自然语言处理:长文本场景下的关键词抽取实践

自然语言处理:长文本场景下的关键词抽取实践

丨汀、的博客 2076

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1456

linux下使用libevent开发遇到的龌龊问题

按照网上例子搞了个httpd的小demo(linvo_httpd.c),遇到一连串问题,努力google了半天,终于得解,记录之~环境:Linux 2.6.18-164.el5libevent-1.4.13首先用gcc编译时候报了类似下面信息的一堆错/tmp/

Linvo's blog 7916

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Linux下libevent的简单使用

libevent是个高效的异步事件通知库,本文主要讲述在Linux下如何简单使用该库。 一 下载 本文写作时使用的版本是2.1.11,下载地址是https://github.com/libevent/libevent/releases/tag/release-2.1.11-stable 本人下载的是zip文件。 二 编译 把第一步下载的压缩文件放到linux下。 先解压,然后按照github上给的教程,在源码根目录下新建build目录,并cd进入,最后执行下面的2个命令进行编译(需要事先安装cmake

爱就是是恒久忍耐的专栏 1526

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux下使用libevent库实现服务器端编程

TCP服务器端一般用到非阻塞Socket、IO复用,Linux可以支持epoll、select,而Windows支持select、IOCP,考虑平台适用性,需要对IO事件进行封装兼容; libevent是一个轻量级的高性能的网络库,使用libevent 进行服务器端开发非常方便,无须过多干涉网络编程的细节,不过还得真正去理解网络处理的原理; 同时,evbuffer内部的缓冲处理也为上层应用提供了不少便利,能够给项目开发带来可观的效率提升;

staticnetwind的专栏 3774

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Linux高并发服务器开发(十二)libevent

相当于epoll中红黑树的节点event_base 就是调用不同的多路IO接口判断事件是否已被激活,核心调用的是epoll,同时支持select和poll获得当前使用的IO多路复用的方法。

Lmz_0314的博客 961

Libevent 学习一:Libevent 源码编译

Libevent 学习一:Libevent 源码编译

myw31415926的专栏 2130

Linux libevent和libev 一

创作人QQ:851301776,邮箱:lfr890207@163.com,欢迎大家一起技术交流,本博客主要是自己学习的心得体会,只为每天进步一点点! 个人座右铭: 1.没有横空出世,只要厚积一定发。 2.你可以学历不高,你可以不上学,但你不能不学习。 一、libevent和libev简述 libevent和libev都是C语言实现的异步事件库,通过注册异步事件,库检测事件触发,从而库根据发生事件的先后顺序,调用响应回调函数进行处理。 事件包括:网络io事件,定时事件。信号事件 事件循环:等待并

weixin_43155199的博客 7238

linux libevent库分析,Linux下使用libevent库实现服务器端编程

Linux下使用libevent库实现服务器端编程Linux下使用libevent库实现服务器端编程一、背景TCP服务器端一般用到非阻塞Socket、IO复用,Linux可以支持epoll、select,而Windows支持select、IOCP,考虑平台适用性,需要对IO事件进行封装兼容;二、相关知识服务端常用到的select、poll、epoll都属于I/O复用模型,常用于单线程上处理多个网...

weixin_39842271的博客 329
上一篇: 网络编程(完成端口IOCP)
下一篇: 使用libevent编写linux服务(二)
CrazyCode_Lee
博客等级 码龄15年 3粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值