我是老吴,一个爱学习的,嵌入式 Linux 驱动工程师。关注我,一起变得更加优秀吧! 哈喽,我是老吴。这两天发现一个还不错的开源项目,记录一下学习心得。dyad 是什么?Dyad 是一个基于 C 语言的异步网络库,旨在轻量级、可移植和易用。它既可用于创建小型独立服务器,也可用于为现有的项目提供网络支持。Github 链接:# 1.3K star
https://github.com/rxi/dyad
之前老吴介绍过另外一个轻量级异步网络库:简单易用的嵌入式网络库 Mongoose。和 Mongoose 对比,Dyad 的特点是:代码更少,整个项目就一个 .c 文件和一个 .h 文件,加起来代码一共 1300 行。功能更纯粹,仅支持 TCP 协议。代码优雅,API 简洁易使用,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。dyad 怎么用?用 dyad 写一个 echo server:echo server 的作用就是客户端给它发送什么,它就回复什么。例如我说 “Hi”,echo server 就会回复 "Hi",代码的主流程如下:int main(void)
{
dyad_Stream *s;
// 初始化 dyad
dyad_init();
// 创建流
s = dyad_newStream();
// 给流添加监听者,监听 ACCEPT 事件
dyad_addListener(s, DYAD_EVENT_ACCEPT, onAccept, NULL);
dyad_listen(s, 8000);
// 睡眠以等待事件的发生
while (dyad_getStreamCount() > 0) {
dyad_update();
}
// 关闭 dyad
dyad_shutdown();
return 0;
}
当有客户端连接上来时,就触发了 ACCEPT 事件,对应的处理函数 onAccept() 就会被调用。在 onAccept() 里我们将监听 DATA 事件。static void onAccept(dyad_Event *e)
{
dyad_addListener(e->remote, DYAD_EVENT_DATA, onData, NULL);
}
当客户端发数据过来时,就触发了 DATA 事件,对应的处理函数 onData() 就会被调用。在 onData() 进行写操作完成 echo 功能。static void onData(dyad_Event *e)
{
dyad_write(e->stream, e->data, e->size);
}
简单到不用 Makefile 就可以编译:$ gcc ../src/dyad.c echoserv.c -o echoserv -I../src
$ ./echoserv # 启动 echo server
用 telnet 测试一下:$ telnet 127.0.0.1 8000
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is '^]'.
Hello World! # 发送给 echo server
Hello World! # 从 echo server 接收
telnet 发送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。点击这里找小助理0元领取:加微信领取资料API 简介:虽然 dyad 的 API 大概有 20 来个:但是最常用的 API 就下面 5 个:dyad_init();
dyad_newStream();
dyad_addListener();
dyad_update();
dyad_shutdown();
如果你不关心 dyad 的内部实现,只要熟悉 dyad 这几个 API, 就可以将 Linux 下的 TCP 网络通讯玩得很溜了。dyad 怎么实现?作为一个爱学习好孩子,dyad 的代码绝对值你好好品读。要理解 dyad 的内部实现,首先是要理解其数据结构的设计。点击查看大图dyad 最重要的概念是 Stream,一个 Stream 可以对应多个 Listener,每一个 Listener 负责监听一种 Event ,当 Event 发生时,调用相应的 Callback 函数。Stream 是怎么设计的?点击查看大图分为 2 部分,其中一部分是 socket 相关的成员,另一部分是数据相关的成员。所有 Stream 都挂在一个链表下。当进入 eventloop 时,会遍历所有的 Stream,处理每一个 Streame 的 Event。检测有无 Event 的 dyad_update() 是在干嘛?本质就是用 select() 检测所有的 Stream 里的 socket 描述符。当有 Event 发生时,根据事件类型,将事件分发给 Stream 上的等待相应 Event 的 Listener,本质就是调用 Listener 绑定的回调函数。点击查看大图总结dyad 是一个超级轻量级的 C 语言异步网络库。它功能纯粹,API 简洁易使用,对于使用者而言,简直就是开箱即用,前提是你需要的一个简单小巧的 TCP Server。另外,其内部的代码实现优雅且巧妙,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。如果你需要的是高性能的服务器,那么应该考虑 libuv。文章链接:https://mp.weixin.qq.com/s/yfv751gOrFr0_YVKu_V_UA转载自:老吴嵌入式 ,作者吴伟东Jack文章链接:适合初学者的、超轻量级 C 语言网络库:dyad