最近发现一个不错的开源项目:只有1300行代码、适合初学者的、超轻量级C语言网络库——Dyad。
dyad 是什么?
Dyad 是一个基于 C 语言的异步网络库,旨在轻量级、可移植和易用。它既可用于创建小型独立服务器,也可用于为现有的项目提供网络支持。
Github 链接:
之前介绍过另外一个轻量级异步网络库: 简单易用的嵌入式网络库 Mongoose。
和 Mongoose 对比,Dyad 的特点是:
代码更少,整个项目就一个 .c 文件和一个 .h 文件,加起来代码一共 1300 行。
功能更纯粹,仅支持 TCP 协议。
代码优雅,API 简洁易使用,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。
dyad 怎么用?
用 dyad 写一个 echo server:
echo server 的作用就是客户端给它发送什么,它就回复什么。例如我说 “Hi”,echo server 就会回复 "Hi",代码的主流程如下:
当有客户端连接上来时,就触发了 ACCEPT 事件,对应的处理函数 onAccept() 就会被调用。在 onAccept() 里我们将监听 DATA 事件。
当客户端发数据过来时,就触发了 DATA 事件,对应的处理函数 onData() 就会被调用。在 onData() 进行写操作完成 echo 功能。
简单到不用 Makefile 就可以编译:
用 telnet 测试一下:
telnet 发送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。
API 简介:
虽然 dyad 的 API 大概有 20 来个:
但是,最常用的 API 就下面 5 个:
如果你不关心 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。
审核编辑:刘清
-
C语言
+关注
关注
180文章
7604浏览量
136680 -
TCP
+关注
关注
8文章
1353浏览量
79054 -
LINUX内核
+关注
关注
1文章
316浏览量
21644
原文标题:一款只有1300行代码的轻量级C语言网络库
文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
相关推荐
评论