最近發現一個不錯的開源項目:只有1300行代碼、適合初學者的、超輕量級C語言網絡庫——Dyad。
dyad 是什么?
Dyad 是一個基于 C 語言的異步網絡庫,旨在輕量級、可移植和易用。它既可用于創建小型獨立服務器,也可用于為現有的項目提供網絡支持。
Github 鏈接:
之前介紹過另外一個輕量級異步網絡庫: 簡單易用的嵌入式網絡庫 Mongoose。
和 Mongoose 對比,Dyad 的特點是:
代碼更少,整個項目就一個 .c 文件和一個 .h 文件,加起來代碼一共 1300 行。
功能更純粹,僅支持 TCP 協議。
代碼優雅,API 簡潔易使用,非常適合初學者用來學習 Linux 網絡編程和了解異步處理的本質。
dyad 怎么用?
用 dyad 寫一個 echo server:
echo server 的作用就是客戶端給它發送什么,它就回復什么。例如我說 “Hi”,echo server 就會回復 "Hi",代碼的主流程如下:
當有客戶端連接上來時,就觸發了 ACCEPT 事件,對應的處理函數 onAccept() 就會被調用。在 onAccept() 里我們將監聽 DATA 事件。
當客戶端發數據過來時,就觸發了 DATA 事件,對應的處理函數 onData() 就會被調用。在 onData() 進行寫操作完成 echo 功能。
簡單到不用 Makefile 就可以編譯:
用 telnet 測試一下:
telnet 發送 "Hello World!" 后,能成功接收到 eco server 返回的 "Hello World!"。
API 簡介:
雖然 dyad 的 API 大概有 20 來個:
但是,最常用的 API 就下面 5 個:
如果你不關心 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。
審核編輯:劉清
-
C語言
+關注
關注
180文章
7601瀏覽量
136251 -
TCP
+關注
關注
8文章
1351瀏覽量
78995 -
LINUX內核
+關注
關注
1文章
316瀏覽量
21619
原文標題:一款只有1300行代碼的輕量級C語言網絡庫
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論