今天给大家分享一款开源、且只有1300 行代码的轻量级 C 语言网络库:Dyad.
dyad 是什么?
Dyad 是一个基于 C 语言的异步网络库,旨在轻量级、可移植和易用。它既可用于创建小型独立服务器,也可用于为现有的项目提供网络支持。
Github 链接:
# 1.3K star
https://github.com/rxi/dyad
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!"。
API 简介:
虽然 dyad 的 API 大概有 20 来个:
![](https://img-blog.csdnimg.cn/img_convert/afcea3ff3d5e18d208c73d39d9da1587.png)
但是最常用的 API 就下面 5 个:
dyad_init();
dyad_newStream();
dyad_addListener();
dyad_update();
dyad_shutdown();
如果你不关心 dyad 的内部实现,只要熟悉 dyad 这几个 API, 就可以将 Linux 下的 TCP 网络通讯玩得很溜了。
dyad 怎么实现?
作为一个爱学习好孩子,dyad 的代码绝对值你好好品读。
要理解 dyad 的内部实现,首先是要理解其数据结构的设计。
![](https://img-blog.csdnimg.cn/img_convert/7b8087a47682cf5c1ad709d4ed483fa6.png)
点击查看大图
dyad 最重要的概念是 Stream,一个 Stream 可以对应多个 Listener,每一个 Listener 负责监听一种 Event ,当 Event 发生时,调用相应的 Callback 函数。
Stream 是怎么设计的?
![](https://img-blog.csdnimg.cn/img_convert/b3ab359ebf92ccad29adf8c4f50f2b00.png)
点击查看大图
分为 2 部分,其中一部分是 socket 相关的成员,另一部分是数据相关的成员。所有 Stream 都挂在一个链表下。当进入 eventloop 时,会遍历所有的 Stream,处理每一个 Streame 的 Event。
检测有无 Event 的 dyad_update() 是在干嘛?
本质就是用 select() 检测所有的 Stream 里的 socket 描述符。
当有 Event 发生时,根据事件类型,将事件分发给 Stream 上的等待相应 Event 的 Listener,本质就是调用 Listener 绑定的回调函数。
![](https://img-blog.csdnimg.cn/img_convert/3a6364807badc700bbc052c17bc9328d.png)
点击查看大图
总结
dyad 是一个超级轻量级的 C 语言异步网络库。
它功能纯粹,API 简洁易使用,对于使用者而言,简直就是开箱即用,前提是你需要的一个简单小巧的 TCP Server。
另外,其内部的代码实现优雅且巧妙,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)