最近發(fā)現(xiàn)一個不錯的開源項目:只有1300行代碼、適合初學者的、超輕量級C語言網(wǎng)絡庫——Dyad。
dyad 是什么?
Dyad 是一個基于 C 語言的異步網(wǎng)絡庫,旨在輕量級、可移植和易用。它既可用于創(chuàng)建小型獨立服務器,也可用于為現(xiàn)有的項目提供網(wǎng)絡支持。
Github 鏈接:

之前介紹過另外一個輕量級異步網(wǎng)絡庫: 簡單易用的嵌入式網(wǎng)絡庫 Mongoose。
和 Mongoose 對比,Dyad 的特點是:
代碼更少,整個項目就一個 .c 文件和一個 .h 文件,加起來代碼一共 1300 行。
功能更純粹,僅支持 TCP 協(xié)議。
代碼優(yōu)雅,API 簡潔易使用,非常適合初學者用來學習 Linux 網(wǎng)絡編程和了解異步處理的本質(zhì)。
dyad 怎么用?
用 dyad 寫一個 echo server:
echo server 的作用就是客戶端給它發(fā)送什么,它就回復什么。例如我說 “Hi”,echo server 就會回復 "Hi",代碼的主流程如下:

當有客戶端連接上來時,就觸發(fā)了 ACCEPT 事件,對應的處理函數(shù) onAccept() 就會被調(diào)用。在 onAccept() 里我們將監(jiān)聽 DATA 事件。

當客戶端發(fā)數(shù)據(jù)過來時,就觸發(fā)了 DATA 事件,對應的處理函數(shù) onData() 就會被調(diào)用。在 onData() 進行寫操作完成 echo 功能。

簡單到不用 Makefile 就可以編譯:

用 telnet 測試一下:

telnet 發(fā)送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。
API 簡介:
雖然 dyad 的 API 大概有 20 來個:

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

如果你不關心 dyad 的內(nèi)部實現(xiàn),只要熟悉 dyad 這幾個 API, 就可以將 Linux 下的 TCP 網(wǎng)絡通訊玩得很溜了。
dyad 怎么實現(xiàn)?
作為一個愛學習好孩子,dyad 的代碼絕對值你好好品讀。 要理解 dyad 的內(nèi)部實現(xiàn),首先是要理解其數(shù)據(jù)結(jié)構(gòu)的設計。 
dyad 最重要的概念是 Stream,一個 Stream 可以對應多個 Listener,每一個 Listener 負責監(jiān)聽一種 Event ,當 Event 發(fā)生時,調(diào)用相應的 Callback 函數(shù)。
Stream 是怎么設計的?
分為 2 部分,其中一部分是 socket 相關的成員,另一部分是數(shù)據(jù)相關的成員。所有 Stream 都掛在一個鏈表下。當進入 eventloop 時,會遍歷所有的 Stream,處理每一個 Streame 的 Event。
檢測有無 Event 的 dyad_update() 是在干嘛?
本質(zhì)就是用 select() 檢測所有的 Stream 里的 socket 描述符。 當有 Event 發(fā)生時,根據(jù)事件類型,將事件分發(fā)給 Stream 上的等待相應 Event 的 Listener,本質(zhì)就是調(diào)用 Listener 綁定的回調(diào)函數(shù)。
總結(jié)
dyad 是一個超級輕量級的 C 語言異步網(wǎng)絡庫。 它功能純粹,API 簡潔易使用,對于使用者而言,簡直就是開箱即用,前提是你需要的一個簡單小巧的 TCP Server。 另外,其內(nèi)部的代碼實現(xiàn)優(yōu)雅且巧妙,非常適合初學者用來學習 Linux 網(wǎng)絡編程和了解異步處理的本質(zhì)。 如果你需要的是高性能的服務器,那么應該考慮 libuv。 
審核編輯:劉清
-
C語言
+關注
關注
183文章
7646瀏覽量
146090 -
TCP
+關注
關注
8文章
1432瀏覽量
83749 -
LINUX內(nèi)核
+關注
關注
1文章
321瀏覽量
23288
原文標題:一款只有1300行代碼的輕量級C語言網(wǎng)絡庫
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一款適合初學者超輕量級C語言網(wǎng)絡庫—Dyad
評論