
libhv
开始学习libhv,支持国产开源软件,不定期更新
不闻窗外事
学无止境
展开
-
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 · 2300 阅读 · 1 评论 -
水平触发和边缘触发
水平触发比较常见,例如select、poll等都是水平触发的,而epoll不仅支持水平触发,也支持边缘触发。实际工作学习中我从未见过使用边缘触发开发的网络程序,但是之前在《Linux多线程服务端编程》这本书中,陈硕大神有一段话:我认为理想的做法是对readable事件采用level trigger,对writable事件采用edge trigger,但是目前Linux不支持这种设定。边缘触发的读还比较好理解,但是写到底是如何工作的,感觉不是太好理解,所以今天写了个测试程序想验证下之前的理解对不对,这篇博客也原创 2020-12-27 12:43:19 · 6353 阅读 · 0 评论 -
创建一个简单的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 · 3455 阅读 · 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 · 4746 阅读 · 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 · 1880 阅读 · 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 · 1633 阅读 · 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 · 2691 阅读 · 0 评论 -
定时器的简单说明
对任何一个网络库,定时器功能都非常重要,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 · 2970 阅读 · 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 · 3754 阅读 · 0 评论 -
宏定义黑魔法
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 · 1211 阅读 · 0 评论 -
heap.h
上一篇写了写链表,这篇写下堆,这个结构接触的不多,所以正好学习一下libhv中的堆,这个堆的实现比较灵活,即可以是大顶堆也可以是小顶堆,通过比较函数是比大还是比小来区别,当然,如果没有比较函数,就成了无序的,感觉没啥意义,就不讨论无序的堆了。堆的定义堆是具有下列性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。完全二叉树是啥就不解释了。。。。。 下面开始看代码结构体定义struct heap_node原创 2020-12-08 12:28:43 · 1763 阅读 · 0 评论 -
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 · 1840 阅读 · 1 评论