系列文章回顾

  libevent学习之入门--[01]概述与安装

  上一节介绍了libevent的下载和编译,从这节开始,我会从我学习的角度逐步探索libevent的源码,慢慢揭开它的神秘面纱。

  面对几十个源文件,很多人都会无从下手,根本不知道跟个源码的层次结构是什么,主要分为哪几个部分,哪些是核心文件,哪些是无关紧要的文件。

  我采用的方法可能是面对这种问题比较好的解决方案,那就是从官方给出的例程入手,窥探出大概的函数调用关系。

  在源代码中有一个文件夹sample,这个文件夹内包含了大量的例程,我们就从亲切的hello-world.c文件入手。

  打开哈喽沃德文件,首先是文件功能说明:

/*
  This example program provides a trivial server program that listens for TCP
  connections on port 9995.  When they arrive, it writes a short message to
  each client connection, and closes each connection once it is flushed.
  Where possible, it exits cleanly in response to a SIGINT (ctrl-c).
*/
大致意思如下:
/*这个示例程序提供了一个简单的服务器程序,它监听端口9995上的TCP连接。
当它们到达时,它会向每个与之连接的客户端写入一条信息,并在刷新后关闭每个连接。
在可能的情况下,它会干净地退出以响应SIGINT(ctrl-c)。
*/

  接着是各种头文件和不同操作系统的预编译,我们全部忽略。继续往下定义了如下全局静态变量和函数:

static const char MESSAGE[] = "Hello, World!\n";
static const int PORT = 9995;
static void listener_cb(struct evconnlistener *, evutil_socket_t, struct sockaddr *, int socklen, void *);
static void conn_writecb(struct bufferevent *, void *);
static void conn_eventcb(struct bufferevent *, short, void *);
static void signal_cb(evutil_socket_t, short, void *);

  可以看出,MESSAGE就是服务器向客户端发送的信息"Hello,World",PORT则是服务器监视的端口9995。后面的四个函数我们暂且先不管,目前还不能确定是什么功能。

  继续往后看,看到了程序入口main函数,这才是我们要分析的入口,开头为一些变量的声明:

struct event_base *base;
struct evconnlistener *listener;
struct event *signal_event;
struct sockaddr_in sin;
#ifdef _WIN32
WSADATA wsa_data;
WSAStartup(0x0201, &wsa_data);
#endif

  从这开始就需要仔细分析了,首先出现了整个程序的四个结构体,可以推断这四个结构体是程序所需要的核心结构体,接着是关于WIN32的条件编译,我们不用管,下面就会对这几个结构体指针进行赋值。

base = event_base_new();
if (!base) {
fprintf(stderr, "Could not initialize libevent!\n");
return 1;
}

  接下来的这段代码对event_base类型的指针进行赋值,赋值过程通过event_base_new函数实现。这时从命名来看,这个base应该就是事件的核心结构,而event_base_new函数则是作为base事件初始化而使用的,这点从下面base初始化失败时的错误信息也可以看出。

  我们分析event_base_new函数,该函数在event.c文件内实现,下面为源码:

struct event_base * event_base_new(void) {
struct event_base *base = NULL;
struct event_config *cfg = event_config_new();
if (cfg) {
base = event_base_new_with_config(cfg);
event_config_free(cfg);
}
return base;
}

libevent学习之入门--[02]从hello-world开始的更多相关文章

  1. 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用

    [网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院  欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...

  2. CSS3基础入门02

    CSS3 基础入门02 边框相关属性 border-radius 通过这个属性我们可以设置边框圆角,即可以将四个角设置为统一的圆角,也可以单独的设置具体的某一个角的圆角. grammer: borde ...

  3. Java工程师学习指南 入门篇

    Java工程师学习指南 入门篇 最近有很多小伙伴来问我,Java小白如何入门,如何安排学习路线,每一步应该怎么走比较好.原本我以为之前的几篇文章已经可以解决大家的问题了,其实不然,因为我之前写的文章都 ...

  4. 093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 02 static关键字 03 static关键字(下)

    093 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 03 # 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 ...

  5. 088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现

    088 01 Android 零基础入门 02 Java面向对象 02 Java封装 01 封装的实现 02 封装的代码实现 本文知识点:Java封装的代码实现 说明:因为时间紧张,本人写博客过程中只 ...

  6. 080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则

    080 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 01 初识面向对象 05 单一职责原则 本文知识点:单一职责原则 说明:因为时间紧张,本人写博客过程中只是 ...

  7. Python学习--01入门

    Python学习--01入门 Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.和PHP一样,它是后端开发语言. 如果有C语言.PHP语言.JAVA语言等其中一种语言的基础,学习Py ...

  8. [IT学习]sql 入门及实例

    sql 是一种数据库查询语言,可以让你很快的查询到数据.其实一般情况下,你也可以采用excel来查询数据库数据. 但是人们通常认为sql会更加灵活和方便一些. sql学习的入门网站: http://w ...

  9. PHP学习笔记 - 入门篇(5)

    PHP学习笔记 - 入门篇(5) 语言结构语句 顺序结构 eg: <?php $shoesPrice = 49; //鞋子单价 $shoesNum = 1; //鞋子数量 $shoesMoney ...

  10. PHP学习笔记 - 入门篇(4)

    PHP学习笔记 - 入门篇(4) 什么是运算符 PHP运算符一般分为算术运算符.赋值运算符.比较运算符.三元运算符.逻辑运算符.字符串连接运算符.错误控制运算符. PHP中的算术运算符 算术运算符主要 ...

随机推荐

  1. 正整数n型方阵

    正整数n型方阵(不用数组完成) 一般呢这种n型方阵很多人都是用数组完成,今天呢小编就用简单的循环控制结构来完成,不需用到数组.题目:从键盘输入一个正整数n,根据n形成一个方阵.方阵最外层是第一层,每层 ...

  2. js实现数字每三位加逗号

    需求: 一个数字,比如 1234,23456.23 实现每三位加逗号 改成如下形式: 1234 => 1,234 23456.23 => 23,456.23 方法一 function fo ...

  3. Eclipse设置背景色等

    1.设置背景色 a.Window->Preferences->General->Editors->Text Editors b.选择Background color选择自定义颜 ...

  4. ubuntu18.04 20.04 22.04 环境下的QGIS安装

    Linux下的QGIS安装 截至到2022年8月份,最新的qgis版本是 QGIS (3.26.x Buenos Aires) 参考网址:https://qgis.org/en/site/foruse ...

  5. Vue2+Cesium1.9+热力图开发笔记

    1.安装cesiumJS.heatmap.webpack插件依赖包: yarn install/npm install "dependencies": { ... "ce ...

  6. vscode 中前端代码不能通过ctrl+鼠标左键点击跳转(亲测可行)

    1.ctrl+p 查找 jsconfig.json文件.如果没有,就在根目录下新建jsconfig.json 2.若已经有文件,如下图新增paths 若没有,复制下面内容到jsconfig.json ...

  7. NSQ(6)-nsq相关策略

    1:nsq的流量控制 RDY 消息中间件的实现无非两种套路,一种让客户端pull,典型的比如kafka便是如此,而另一种则是push,也就是让客户端不需要做任何操作,只需要做好conn便可以源源不断收 ...

  8. vue页面点击按钮增加和删除标签

    1.在data()里定义一个空数组: conditions:[], 2.给数组一个容器,并且遍历数组 <div v-for="item in conditions">& ...

  9. 阿里云初始化,epel库,docker安装的一般步骤,和java8 升级 java11 的一些bug,无法显示验证码,等

    1. 反射异常 有些反射异常,不是自己代码的错而是一些框架调用的时候,所带来的,不好处理. 用压制输出的形式,1行为压制,2行为调试模式,输出所有的报错信息.这里用java.base / java.n ...

  10. JavaScript的原型和原型链

    说到JavaScript的原型和原型链,相关文章已有不少,但是大都晦涩难懂.本文将换一个角度出发,先理解原型和原型链是什么,有什么作用,再去分析那些令人头疼的关系. 一.引用类型皆为对象 原型和原型链 ...