自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(212)
  • 资源 (1)
  • 收藏
  • 关注

原创 hio_write

之前的博客已经提到发送数据要比接收数据难,因为发送数据时主动的,接收数据是被动的。而且因为libhv采用的是level trigger,因此只有在需要时才关注writeable事件,否则就会造成busy loop。原因可以参考上一篇博客。int hio_write (hio_t* io, const void* buf, size_t len) { //判断io是否处于关闭状态 if (io->closed) { hloge("hio_write called b

2020-12-27 12:43:48 1710 1

原创 水平触发和边缘触发

水平触发比较常见,例如select、poll等都是水平触发的,而epoll不仅支持水平触发,也支持边缘触发。实际工作学习中我从未见过使用边缘触发开发的网络程序,但是之前在《Linux多线程服务端编程》这本书中,陈硕大神有一段话:我认为理想的做法是对readable事件采用level trigger,对writable事件采用edge trigger,但是目前Linux不支持这种设定。边缘触发的读还比较好理解,但是写到底是如何工作的,感觉不是太好理解,所以今天写了个测试程序想验证下之前的理解对不对,这篇博客也

2020-12-27 12:43:19 5941

原创 创建一个简单的tcp客户端

因为上一篇写创建tcp服务端已经把很多重要接口分析过了,这一篇会写的比较简单。与创建tcp服务端类似,创建一个客户端的步骤如下: hloop_t* loop = hloop_new(HLOOP_FLAG_QUIT_WHEN_NO_ACTIVE_EVENTS); //创建一个loop hio_t* sockio = hloop_create_tcp_client(loop, host, port, on_connect); hio_setcb_close(sockio, on

2020-12-20 20:06:51 3056 4

原创 创建一个简单的TCP服务器

以tcp_echo_server.c为例,说明创建tcp服务器的程序流程。int main(int argc, char** argv) { if (argc < 2) { printf("Usage: tcp port\n"); return -10; } int port = atoi(argv[1]); hloop_t* loop = hloop_new(0); //创建一个loop //创建一个用来监听的io,用来

2020-12-19 12:43:52 4038 3

原创 custom事件

libhv提供了一个接口,可以由用户自己添加事件,接口为:// NOTE: hloop_post_event is thread-safeHV_EXPORT void hloop_post_event(hloop_t* loop, hevent_t* ev);首先看下该接口的实现void hloop_post_event(hloop_t* loop, hevent_t* ev) { char buf = '1'; if (loop->sockpair[0] == -

2020-12-17 12:48:38 1507 1

原创 idle事件

在libhv中,除了支持IO事件和定时器事件,还有idle和custom两种事件。idle比较简单,下一篇再分析custom。idle空闲事件,即在空闲时处理的事件libhv提供了两个接口操作idle事件//添加idle事件HV_EXPORT hidle_t* hidle_add(hloop_t* loop, hidle_cb cb, uint32_t repeat DEFAULT(INFINITE));//删除idle事件HV_EXPORT void hidle_del(hidle

2020-12-16 16:26:48 1346 1

原创 heartbeat和keepalive

libhv提供了设置心跳和保活机制的接口HV_EXPORT void hio_set_heartbeat(hio_t* io, int interval_ms, hio_send_heartbeat_fn fn);HV_EXPORT void hio_set_keepalive_timeout(hio_t* io, int timeout_ms DEFAULT(HIO_DEFAULT_KEEPALIVE_TIMEOUT));在分析源码之前,先说下通过心跳机制的重要意义,首先,可以通过检测心跳可以

2020-12-16 10:59:14 2013

原创 定时器的简单说明

对任何一个网络库,定时器功能都非常重要,libhv当然也不例外,今天先对目前我所使用的定时器功能做一个简单说明。libhv主要提供了三个接口使用定时器,添加、删除和重置,还有一个htimer_add_period,目前没用过,先不说了。。。。htimer_t* htimer_add(hloop_t* loop, htimer_cb cb, uint32_t timeout, uint32_t repeat DEFAULT(INFINITE));void htimer_del(htimer_t*

2020-12-15 12:44:43 2326 2

原创 事件的优先级机制

在libhv库中,可以对各种事件设置不同的优先级,库提供了一个设置宏,可以简单设置。#define hevent_set_priority(ev, prio) ((hevent_t*)(ev))->priority = prio使用方法很简单,而且在hloop_test.c测试文件中有使用例子,不再多说,下面简单说下libhv对不同优先级事件的处理方式在hloop_process_events接口中,处理各种事件,其中定时器是具有最高优先级的,在libhv中,如果存在定时器任务,会优

2020-12-15 11:58:10 3260

原创 宏定义黑魔法

1、#define CLR_RED "\033[31m" /* 红色字 */#define CLR_GREEN "\033[32m" /* 绿色字 */#define CLR_YELLOW "\033[33m" /* 黄色字 */#define CLR_BLUE "\033[34m" /* 蓝色字 */#define CLR_PURPLE "\033[35m" /* 紫色字 */.

2020-12-11 14:27:24 1020

原创 heap.h

上一篇写了写链表,这篇写下堆,这个结构接触的不多,所以正好学习一下libhv中的堆,这个堆的实现比较灵活,即可以是大顶堆也可以是小顶堆,通过比较函数是比大还是比小来区别,当然,如果没有比较函数,就成了无序的,感觉没啥意义,就不讨论无序的堆了。堆的定义堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。完全二叉树是啥就不解释了。。。。。 下面开始看代码结构体定义struct heap_node

2020-12-08 12:28:43 1383

原创 list.h

在libhv库中,有一个双向链表的实现,刚看的时候感觉有点疑惑,因为这个链表没有数据,只有前指针和后指针,跟过去学的不太一样,于是仔细分析了一下。首先是结构体:struct list_head { struct list_head *next, *prev;};#define list_node list_head该结构体不包含数据信息。下面的初始化:static inline void list_init(struct list_head *list){ list-&

2020-12-06 13:46:06 1486 1

原创 简单的单进程的网络流量监控程序

前一篇博客说了nethogs的一些问题,因为nethogs无法满足我的需求,所以自己写了一个,因为对libpcap库和网络协议了解有限,所以可能存在一些问题。目前该程序只支持指定PID的进程网络流量监控,支持TCP和UDP,输出的信息包括:1s的平均流量、10s的每秒平均流量、60s的每秒平均流量、从监控开始的总的流量。代码如下:decpcap.c和decpcap.h是nethogs封装的接口,直接拿来用了。。。。decpcap.c#include "decpcap.h"#include &

2020-12-05 15:08:02 1155 2

原创 nethogs的局限性

之前想找一个可以监视系统进程网络流量的工具,网上都推荐使用nethogs,我在自己的linux系统上安装了nethogs,感觉还挺好用的,但是当我在公司的服务器上运行的时候就会出现各种问题,有时候会卡死,有时候虽然不卡死,显示的信息也不太对,奇奇怪怪,但是又很想用这个功能,于是阅读了下nethogs的源码,发现了一些问题,应该是该工具存在一些局限性。我所谓的局限性主要体现在 当服务器上都大量的网络连接,也就是短连接比较多的情况,nethogs就无法正常工作了。而我是用的服务器恰恰有比较多的短连接,导致该

2020-12-05 10:36:13 1322

原创 vscode远端无法追踪代码以及如何使用VSIX

今天配置vscode 的远端功能后,无法追踪代码,而且有个报错,显示:Downloading package ‘C/C++ language components (Windows)‘ Failed. Retrying... Failed. Retrying...解决办法是从https://github.com/microsoft/vscode-cpptools/releases这里下载需要的包然后使用vscode的从VSIX安装,左键扩展旁边的三个点,就可以看到从VSIX安装,之后选择刚...

2020-12-03 18:09:58 1567 1

原创 超简单计算器的C++实现,只支持加减乘除和括号

#include <string>#include <iostream>#include <stack>#include <vector>#include <map>#include <assert.h>using namespace std;string strip(const string &s, const string &chars = ""){ if (s.empty()) .

2020-11-25 13:29:14 1807

原创 桥接模式--结构型模式

1、描述桥接是一种结构型模式,可将业务逻辑或一个大类拆分成为不同的层次结构,从而能独立的进行开发。层次结构中的第一层(通常称为抽象部分)将包含对第二层(实现部分)对象的引用。抽象部分能将一些(有时是绝大部分)对自己的调用委派给实现部分的对象。所有的实现部分都有一个通用接口,因此他们能在抽象部分内部相互替换。2、结构图Abstraction:提供高层控制逻辑,依赖于完成底层实际工作的实现对像 Implementation:为所有具体实现声明通用接口。抽象部分仅能通过在这里声明的方法与实现

2020-11-25 08:37:15 213

原创 享元模式--结构型模式

1、描述2、结构图3、C++代码

2020-11-24 18:11:08 205

原创 状态模式--行为模式

1、描述状态是一种行为设计模式,让你能在一个对象的内部状态变化时改变其行为。该模式将与状态相关的行为抽取到独立的状态类中,让原对象将工作委派给这些类的实例,而不是自行进行处理。2、结构图3、C++代码#include <iostream>#include <typeinfo>class Context;//状态基类声明了一些所有的具体状态类都需要实现的方法;并且提供了一个与状态关联的Context对象//的回溯引用。状态类使用该回溯引用转换到其他

2020-11-24 16:17:24 149

原创 访问者模式--行为模式

1、描述访问者是一种行为设计模式,允许你在不修改已有代码的清空下向已有类层次结构中添加新的行为。2、结构图3、C++代码#include <iostream>#include <string>#include <array>/** * The Visitor Interface declares a set of visiting methods that correspond to * component classes. The sig

2020-11-24 15:17:14 154

原创 备忘录模式--行为模式

1、描述备忘录是一种行为设计模式,允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构,也不会影响快照中保存的数据。2、结构图3、C++代码#include <string>#include <iostream>#include <vector>#include <time.h>//备忘录接口提供了一种获取元数据的方法,例如创建日期或名称。但是,它不会暴露发起者的状态class Memento {

2020-11-24 13:50:13 129

原创 外观模式--结构型模式

1、描述外观是一种结构型设计模式,能为复杂系统、程序库或框架提供一个简单(但有限)的接口尽管外观模式降低了程序的整体复杂度,但它同时也有助于将不需要的依赖移动到同一个位置。2、结构图3、C++代码#include <string>#include <iostream>//外观类可以使用子系统,客户也可以直接使用子系统//对于子系统来说,外观类也是另一个客户,而不是子系统的一部分。class Subsystem1 { public: std::

2020-11-24 11:22:21 136

原创 观察者模式--行为模式

1、描述观察者是一种行为设计模式,允许一个对象将其状态的改变通知其他对象。观察者模式提供了一种作用于任何实现了订阅者接口的对象的机制,可对其事件进行订阅和取消订阅。2、结构图3、C++代码#include <iostream>#include <list>#include <string>class IObserver { public: virtual ~IObserver(){}; virtual void Update(c

2020-11-24 10:44:07 196

原创 组合模式--结构型模式

1、描述组合是一种结构型设计模式,你可以使用它将对象组合成树状结构,并且能向使用独立对象一样使用它们。对于绝大多数需要生成树状结构的问题来说,组合都是非常受欢迎的解决方案。组合最主要的功能是在整个树状结构上递归调用方法并对结果进行汇总。2、结构图Component:描述了树中简单项目和负责项目共有的操作 Leaf:树的基本结构,它不包含子项目。一般情况下,叶结点最终会完成大部分的实际工作,因为它们无法将工作指派给其他部分 Composite:包含叶节点或其他容器等子项目的单位。容器不

2020-11-24 10:02:34 177

原创 迭代器模式--行为模式

1、描述2、结构图3、C++代码

2020-11-24 09:09:48 94

原创 适配器模式--结构型模式

1、描述适配器模式是一种结构型设计模式,它能使接口不兼容的对象能够相互合作。2、结构图对象适配器实现时使用了构成原则:适配器实现了其中一个对象的接口,并对另一个对象进行封装。所有流行的编程语言都可以实现适配器。client是包含当前程序业务逻辑的类 Target描述了其他类与客户端代码合作时必须遵循的协议 Adaptee中有一些功能类,客户端与其接口不兼容,因此无法直接调用其功能 Adapter是一个可以同时与客户端与服务交互的类:它在实现客户端接口的同时封帐了服务对象...

2020-11-23 18:08:07 219

原创 策略模式--行为模式

1、描述策略是一种行为设计模式,它将一组行为转换为对象,并使其在原始上下文对象内部能够相互替换。原始对象被称为上下文,它包含指向策略对象的引用并将执行行为的任务分派给策略对象。2、结构图3、C++程序#include <string>#include <vector>#include <iostream>#include <algorithm>//策略抽象类声明了默写算法所有受支持版本的通用操作class Strategy

2020-11-23 16:44:53 204

原创 装饰模式--结构型模式

1、描述装饰是一种结构设计模式,允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。由于目标对象和装饰器遵循同一接口,因此你可用装饰来对对象进行无限次的封装。结果对象将获得所有封装器叠加而来的行为。2、结构图3、C++代码#include <string>#include <iostream>//基础组件定义了可以被装饰器修改的操作class Component { public: virtual ~Component() {} virt

2020-11-23 15:21:20 149

原创 责任链模式--行为模式

1、描述责任链是一种行为设计模式,允许你将请求沿着处理者链进行发送,直至其中一个处理者对其进行处理。该模式允许多个对象来对请求进行处理,而无需让发送者类与具体接受者类相耦合。链可在运行时由遵循标准处理者接口的任意处理者动态生成。2、结构图3、C++代码...

2020-11-23 14:16:25 151

原创 命令模式--行为模式

1、描述命令是一种行为设计模式,它可将请求或简单操作转换为一个对象。此类转换让你能够延迟进行或远程执行请求,还可将其放入队列中。2、结构图3、C++代码#include <iostream>#include <string>//命令接口声明了一个执行命令的方法class Command { public: virtual ~Command() { } virtual void Execute() const = 0;};//一些.

2020-11-23 11:28:30 254

原创 中介者模式--行为模式

1、描述中介者是一种行为设计模式,让程序组件通过特殊的中介者对象进行间接沟通,达到减少组件之间依赖关系的目的。中介者能使得程序更易于修改和扩展,而且能更方便地对独立的组件进行复用,因为它们不再依赖于很多其他的类。2、结构图3、C++代码#include <iostream>#include <string>//中介者接口声明了一个能让组件将各种事件通知给中介者的方法。中介者可对这些事件//做出响应并将执行工作传递给其他组件class BaseCompo

2020-11-23 10:31:34 80

原创 原型模式--创建型模式

1、描述原型是一种创建型设计模式,使你能够复制对象,甚至是复杂对象,而又无需使代码依赖它们所属的类。所有的原型类都必须有一个通用的接口,使得即使在对象所属的具体类未知的情况下也能复制对象。原型对象可以生成自身的完整副本,因为相同类的对象可以相互访问对方的私有成员变量。2、结构图3、C++代码#include <string>#include <vector>#include <iostream>#include <unordered_ma

2020-11-23 09:14:14 209

原创 代理模式--结构型模式

1、描述代理是一种结构型设计模式,让你能提供真实服务对象的替代品给客户端使用。代理接收客户端的请求并进行一些处理(访问控制和缓存等),然后再将请求传递给服务对象。代理对象拥有和服务对象相同的接口,这使得当其被传递给客户端时可与真实对象互换。2、结构图Subject声明了服务接口,代理必须遵循该接口才能伪装成服务对象 RealSubject提供了一些实用的业务逻辑 Proxy包含了一个指向RealSubject对象的引用成员变量。代理完成其任务(例如延迟初始化、记录日志、访问控制和缓存

2020-11-23 08:23:41 106

原创 生成器模式--创建型模式

1、描述生成器模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。2、结构图生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤 具体生成器(ConcreateBuilder)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品 产品(Product)是最终生成的对象。由不同生成器构造的参评无需属于同一类层次结构或接口 主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定...

2020-11-23 08:21:38 210

原创 模板方法模式--行为模式

1、描述模板方法是一种行为设计模式,它在基类中定义了一个算法的框架,允许子类在不修改结构的情况下重写算法的特定步骤。2、结构图抽象类(AbstractClass)会声明作为算法步骤的方法,以及依次调用它们的实际模板方法。算法步骤可以被声明为抽象类型,也可以提供一些默认实现 具体类(ConcreteClass)重写所有步骤,但不能重写模板方法自身。3、C++代码#include <iostream>#include <string>//抽象类定义了一个模

2020-11-23 08:20:34 78

原创 抽象工厂模式--创建型模式

1、描述抽象工厂模式是一种创建型设计模式,它能创建一系列相关的对象,而无需指定其具体类。什么是“系列对象”?例如有这样一组的对象:​运输工具+引擎+控制器。它可能会有几个变体:汽车+内燃机+方向盘 飞机+喷气式发动机+操纵杆如果你的程序中并不涉及产品系列的话,那就不需要抽象工厂。2、结构图3、C++代码#include <string>#include <iostream>// 系列产品中的特定产品必须有一...

2020-11-22 16:24:00 187

原创 简单工厂模式--创建型模式

描述:简单工厂模式描述了一个类,它拥有一个包含大量条件语句的构建方法,可根据方法的参数来选择对何种产品进行初始化并将其返回。简单工厂通常没有子类,但当从一个简单工厂中抽取出子类后,它看上去更像经典的工厂方法模式了。结构图:C++实现:#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {}

2020-11-22 15:10:54 125

原创 工厂方法模式--创建型模式

工厂方法是一种创建型设计模式,解决了在不指定具体类的情况下创建产品对象的问题。1、结构图2、C++代码#include <string>#include <iostream>// 产品接口中将声明所有具体产品都必须实现的操作。class Product { public: virtual ~Product() {} virtual std::string Operation() const = 0;};// 具体产品需提供产品接口的各种实现。

2020-11-22 14:55:13 255

原创 单例模式--创建型模式

1、描述单例是一种创建型设计模式,让你能够保证一个类只有一个实例,并提供一个访问该实例的全局节点。单例拥有与全局变量相同的优缺点。尽管它们非常有用,但却会破坏代码的模块化特性。2、结构图3、C++代码在muduo库中有一个单例类模板,可以参考https://blog.csdn.net/qu1993/article/details/109476614下面是一个使用互斥锁实现的线程安全的单例类,这个例子是最后提到的网站的例子,但我觉得这个例子不太好#include <...

2020-11-22 14:37:46 687 1

原创 开闭原则

《设计模式之禅》定义:Software entities like classes,moduls and functions should be open for extension but closed for modifications.(一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。)开闭原则告诉我们赢尽量通过扩展 软件实体的行为来实现变化,而不是通过修改已有的代码来完成变化,它是为软件实体的未来事件而制定的对现行开发设计进行约束的一个原则。为什么要采用开闭原则首先,开闭原则

2020-11-22 12:52:07 92

通过路径的方式对树进行增删改查

通过路径的方式对树进行增删改查,使用二叉树的方式存储普通的树,并实现对于树的增删改查等接口函数,包括测试程序。

2018-10-21

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除