一款只有1300 行代码的轻量级 C 语言网络库

Posted strongerHuang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一款只有1300 行代码的轻量级 C 语言网络库相关的知识,希望对你有一定的参考价值。

关注+星标公众,不错过精彩内容

转自 | 老吴嵌入式

今天给大家分享一款开源、且只有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 来个:

但是最常用的 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。

声明:本文素材来源网络,版权归原作者所有。如涉及作品版权问题,请与我联系删除。

------------ END ------------


●专栏《嵌入式工具

●专栏《嵌入式开发》

●专栏《Keil教程》

●嵌入式专栏精选教程

关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。


点击“阅读原文”查看更多分享。

以上是关于一款只有1300 行代码的轻量级 C 语言网络库的主要内容,如果未能解决你的问题,请参考以下文章

Tinyhttpd - 超轻量型Http Server,使用C语言开发,全部代码只有502行(包括注释),附带一个简单的Client

C语言C语言标准库大梳理(超全)

C 语言网络编程 — 轻量级 HTTP 服务器设计与实现

C 语言网络编程 — 轻量级 HTTP 服务器设计与实现

1000+ Python第三方库大合集,从入门到精通,指日可待!

1000+ Python第三方库大合集,从入门到精通,指日可待!