最近發(fā)現(xiàn)一個(gè)不錯(cuò)的開(kāi)源項(xiàng)目:只有1300行代碼、適合初學(xué)者的、超輕量級(jí)C語(yǔ)言網(wǎng)絡(luò)庫(kù)——Dyad。
dyad 是什么?
Dyad 是一個(gè)基于 C 語(yǔ)言的異步網(wǎng)絡(luò)庫(kù),旨在輕量級(jí)、可移植和易用。它既可用于創(chuàng)建小型獨(dú)立服務(wù)器,也可用于為現(xiàn)有的項(xiàng)目提供網(wǎng)絡(luò)支持。
Github 鏈接:
之前介紹過(guò)另外一個(gè)輕量級(jí)異步網(wǎng)絡(luò)庫(kù): 簡(jiǎn)單易用的嵌入式網(wǎng)絡(luò)庫(kù) Mongoose。
和 Mongoose 對(duì)比,Dyad 的特點(diǎn)是:
代碼更少,整個(gè)項(xiàng)目就一個(gè) .c 文件和一個(gè) .h 文件,加起來(lái)代碼一共 1300 行。
功能更純粹,僅支持 TCP 協(xié)議。
代碼優(yōu)雅,API 簡(jiǎn)潔易使用,非常適合初學(xué)者用來(lái)學(xué)習(xí) Linux 網(wǎng)絡(luò)編程和了解異步處理的本質(zhì)。
dyad 怎么用?
用 dyad 寫一個(gè) echo server:
echo server 的作用就是客戶端給它發(fā)送什么,它就回復(fù)什么。例如我說(shuō) “Hi”,echo server 就會(huì)回復(fù) "Hi",代碼的主流程如下:

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

當(dāng)客戶端發(fā)數(shù)據(jù)過(guò)來(lái)時(shí),就觸發(fā)了 DATA 事件,對(duì)應(yīng)的處理函數(shù) onData() 就會(huì)被調(diào)用。在 onData() 進(jìn)行寫操作完成 echo 功能。

簡(jiǎn)單到不用 Makefile 就可以編譯:

用 telnet 測(cè)試一下:

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

但是,最常用的 API 就下面 5 個(gè):

如果你不關(guān)心 dyad 的內(nèi)部實(shí)現(xiàn),只要熟悉 dyad 這幾個(gè) API, 就可以將 Linux 下的 TCP 網(wǎng)絡(luò)通訊玩得很溜了。
dyad 怎么實(shí)現(xiàn)?
作為一個(gè)愛(ài)學(xué)習(xí)好孩子,dyad 的代碼絕對(duì)值你好好品讀。 要理解 dyad 的內(nèi)部實(shí)現(xiàn),首先是要理解其數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì)。
dyad 最重要的概念是 Stream,一個(gè) Stream 可以對(duì)應(yīng)多個(gè) Listener,每一個(gè) Listener 負(fù)責(zé)監(jiān)聽(tīng)一種 Event ,當(dāng) Event 發(fā)生時(shí),調(diào)用相應(yīng)的 Callback 函數(shù)。
Stream 是怎么設(shè)計(jì)的?
分為 2 部分,其中一部分是 socket 相關(guān)的成員,另一部分是數(shù)據(jù)相關(guān)的成員。所有 Stream 都掛在一個(gè)鏈表下。當(dāng)進(jìn)入 eventloop 時(shí),會(huì)遍歷所有的 Stream,處理每一個(gè) Streame 的 Event。
檢測(cè)有無(wú) Event 的 dyad_update() 是在干嘛?
本質(zhì)就是用 select() 檢測(cè)所有的 Stream 里的 socket 描述符。 當(dāng)有 Event 發(fā)生時(shí),根據(jù)事件類型,將事件分發(fā)給 Stream 上的等待相應(yīng) Event 的 Listener,本質(zhì)就是調(diào)用 Listener 綁定的回調(diào)函數(shù)。
總結(jié)
dyad 是一個(gè)超級(jí)輕量級(jí)的 C 語(yǔ)言異步網(wǎng)絡(luò)庫(kù)。 它功能純粹,API 簡(jiǎn)潔易使用,對(duì)于使用者而言,簡(jiǎn)直就是開(kāi)箱即用,前提是你需要的一個(gè)簡(jiǎn)單小巧的 TCP Server。 另外,其內(nèi)部的代碼實(shí)現(xiàn)優(yōu)雅且巧妙,非常適合初學(xué)者用來(lái)學(xué)習(xí) Linux 網(wǎng)絡(luò)編程和了解異步處理的本質(zhì)。 如果你需要的是高性能的服務(wù)器,那么應(yīng)該考慮 libuv。
審核編輯:劉清
-
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7632瀏覽量
141597 -
TCP
+關(guān)注
關(guān)注
8文章
1402瀏覽量
81003 -
LINUX內(nèi)核
+關(guān)注
關(guān)注
1文章
317瀏覽量
22390
原文標(biāo)題:一款只有1300行代碼的輕量級(jí)C語(yǔ)言網(wǎng)絡(luò)庫(kù)
文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
求推薦一款適合初學(xué)者學(xué)習(xí)的單片機(jī)學(xué)習(xí)/開(kāi)發(fā)版,及配套的
初學(xué)dsp,想問(wèn)一下哪款dsp的開(kāi)發(fā)版適合初學(xué)者?
適合初學(xué)者的51單片機(jī)C語(yǔ)言編程入門PDF下載
一種超輕量級(jí)的flashKV數(shù)據(jù)存儲(chǔ)方案分享
C語(yǔ)言初學(xué)者入門講座
非常適合C語(yǔ)言初學(xué)者寶典[C和指針(第二版)].(美)掃描版
verilog_經(jīng)驗(yàn)(適合初學(xué)者)
fpga開(kāi)發(fā)板推薦初學(xué)者
FPGA初學(xué)者必讀文檔

初學(xué)者如何入門C語(yǔ)言

適合初學(xué)者的螺旋稱重喂料機(jī)

評(píng)論