一款适合初学者超轻量级C语言网络库—Dyad

电子说

1.2w人已加入

描述

最近发现一个不错的开源项目:只有1300行代码、适合初学者的、超轻量级C语言网络库——Dyad。

dyad 是什么?

Dyad 是一个基于 C 语言的异步网络库,旨在轻量级、可移植和易用。它既可用于创建小型独立服务器,也可用于为现有的项目提供网络支持。

Github 链接

TCP


之前介绍过另外一个轻量级异步网络库: 简单易用的嵌入式网络库 Mongoose。

和 Mongoose 对比,Dyad 的特点是

代码更少,整个项目就一个 .c 文件和一个 .h 文件,加起来代码一共 1300 行。

功能更纯粹,仅支持 TCP 协议。

代码优雅,API 简洁易使用,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。

dyad 怎么用?

用 dyad 写一个 echo server:

echo server 的作用就是客户端给它发送什么,它就回复什么。例如我说 “Hi”,echo server 就会回复 "Hi",代码的主流程如下:


TCP

当有客户端连接上来时,就触发了 ACCEPT 事件,对应的处理函数 onAccept() 就会被调用。在 onAccept() 里我们将监听 DATA 事件。

TCP

当客户端发数据过来时,就触发了 DATA 事件,对应的处理函数 onData() 就会被调用。在 onData() 进行写操作完成 echo 功能。

TCP

简单到不用 Makefile 就可以编译:

 TCP

用 telnet 测试一下:

TCP

telnet 发送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。

API 简介:

虽然 dyad 的 API 大概有 20 来个:

TCP

但是,最常用的 API 就下面 5 个:

TCP

如果你不关心 dyad 的内部实现,只要熟悉 dyad 这几个 API, 就可以将 Linux 下的 TCP 网络通讯玩得很溜了。

dyad 怎么实现?

作为一个爱学习好孩子,dyad 的代码绝对值你好好品读。 要理解 dyad 的内部实现,首先是要理解其数据结构的设计。 TCP

dyad 最重要的概念是 Stream,一个 Stream 可以对应多个 Listener,每一个 Listener 负责监听一种 Event ,当 Event 发生时,调用相应的 Callback 函数。

Stream 是怎么设计的?

TCP

分为 2 部分,其中一部分是 socket 相关的成员,另一部分是数据相关的成员。所有 Stream 都挂在一个链表下。当进入 eventloop 时,会遍历所有的 Stream,处理每一个 Streame 的 Event。

检测有无 Event 的 dyad_update() 是在干嘛?

本质就是用 select() 检测所有的 Stream 里的 socket 描述符。 当有 Event 发生时,根据事件类型,将事件分发给 Stream 上的等待相应 Event 的 Listener,本质就是调用 Listener 绑定的回调函数。

TCP
 

总结

dyad 是一个超级轻量级的 C 语言异步网络库。 它功能纯粹,API 简洁易使用,对于使用者而言,简直就是开箱即用,前提是你需要的一个简单小巧的 TCP Server。 另外,其内部的代码实现优雅且巧妙,非常适合初学者用来学习 Linux 网络编程和了解异步处理的本质。 如果你需要的是高性能的服务器,那么应该考虑 libuv。 TCP




审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分