最近發(fā)現(xiàn)一個不錯的開源項目:只有1300行代碼、適合初學(xué)者的、超輕量級C語言網(wǎng)絡(luò)庫——Dyad。
dyad 是什么?
Dyad 是一個基于 C 語言的異步網(wǎng)絡(luò)庫,旨在輕量級、可移植和易用。它既可用于創(chuàng)建小型獨立服務(wù)器,也可用于為現(xiàn)有的項目提供網(wǎng)絡(luò)支持。
Github 鏈接:
之前介紹過另外一個輕量級異步網(wǎng)絡(luò)庫: 簡單易用的嵌入式網(wǎng)絡(luò)庫 Mongoose。
和 Mongoose 對比,Dyad 的特點是:
代碼更少,整個項目就一個 .c 文件和一個 .h 文件,加起來代碼一共 1300 行。
功能更純粹,僅支持 TCP 協(xié)議。
代碼優(yōu)雅,API 簡潔易使用,非常適合初學(xué)者用來學(xué)習(xí) Linux 網(wǎng)絡(luò)編程和了解異步處理的本質(zhì)。
dyad 怎么用?
用 dyad 寫一個 echo server:
echo server 的作用就是客戶端給它發(fā)送什么,它就回復(fù)什么。例如我說 “Hi”,echo server 就會回復(fù) "Hi",代碼的主流程如下:
當(dāng)有客戶端連接上來時,就觸發(fā)了 ACCEPT 事件,對應(yīng)的處理函數(shù) onAccept() 就會被調(diào)用。在 onAccept() 里我們將監(jiān)聽 DATA 事件。
當(dāng)客戶端發(fā)數(shù)據(jù)過來時,就觸發(fā)了 DATA 事件,對應(yīng)的處理函數(shù) onData() 就會被調(diào)用。在 onData() 進行寫操作完成 echo 功能。
簡單到不用 Makefile 就可以編譯:
用 telnet 測試一下:
telnet 發(fā)送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。
API 簡介:
雖然 dyad 的 API 大概有 20 來個:
但是,最常用的 API 就下面 5 個:
如果你不關(guān)心 dyad 的內(nèi)部實現(xiàn),只要熟悉 dyad 這幾個 API, 就可以將 Linux 下的 TCP 網(wǎng)絡(luò)通訊玩得很溜了。
dyad 怎么實現(xiàn)?
作為一個愛學(xué)習(xí)好孩子,dyad 的代碼絕對值你好好品讀。 要理解 dyad 的內(nèi)部實現(xiàn),首先是要理解其數(shù)據(jù)結(jié)構(gòu)的設(shè)計。
dyad 最重要的概念是 Stream,一個 Stream 可以對應(yīng)多個 Listener,每一個 Listener 負責(zé)監(jiān)聽一種 Event ,當(dāng) Event 發(fā)生時,調(diào)用相應(yīng)的 Callback 函數(shù)。
Stream 是怎么設(shè)計的?
分為 2 部分,其中一部分是 socket 相關(guān)的成員,另一部分是數(shù)據(jù)相關(guān)的成員。所有 Stream 都掛在一個鏈表下。當(dāng)進入 eventloop 時,會遍歷所有的 Stream,處理每一個 Streame 的 Event。
檢測有無 Event 的 dyad_update() 是在干嘛?
本質(zhì)就是用 select() 檢測所有的 Stream 里的 socket 描述符。 當(dāng)有 Event 發(fā)生時,根據(jù)事件類型,將事件分發(fā)給 Stream 上的等待相應(yīng) Event 的 Listener,本質(zhì)就是調(diào)用 Listener 綁定的回調(diào)函數(shù)。
總結(jié)
dyad 是一個超級輕量級的 C 語言異步網(wǎng)絡(luò)庫。 它功能純粹,API 簡潔易使用,對于使用者而言,簡直就是開箱即用,前提是你需要的一個簡單小巧的 TCP Server。 另外,其內(nèi)部的代碼實現(xiàn)優(yōu)雅且巧妙,非常適合初學(xué)者用來學(xué)習(xí) Linux 網(wǎng)絡(luò)編程和了解異步處理的本質(zhì)。 如果你需要的是高性能的服務(wù)器,那么應(yīng)該考慮 libuv。
審核編輯:劉清
-
C語言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136680 -
TCP
+關(guān)注
關(guān)注
8文章
1353瀏覽量
79054 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
316瀏覽量
21644
原文標(biāo)題:一款只有1300行代碼的輕量級C語言網(wǎng)絡(luò)庫
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論