發布乙個modern c 編寫的網路庫

2022-07-14 11:03:29 字數 1299 閱讀 1982

uv-cpp是乙個基於libuv的c++封裝網路庫,基於本人實際專案需求開發並使用。介面較為簡單易用,並對libuv一些特性做了擴充套件及優化。壓測結果穩定、高效。暫未發現記憶體洩漏及崩潰等相關bug。

截至目前,c++沒有標準網路庫,常見的有ace和boost.asio。ace較為龐大臃腫,封裝複雜,個人不推薦。boost.asio是boost庫的一部分,需要依賴boost的部分實現,使用asio需要在專案引入較為龐大的boost庫(雖然也可以脫離boost,個人不太習慣asio的介面)。而c語言的網路庫主要有libevent、libev及libuv。libuv是nodejs的底層,較為成熟。所以如果在專案需要一套輕量級,且沒有太多依賴的網路元件,最好的辦法,還是自己封裝一套。

1.實現了c++功能的**

首先libuv是乙個c語言庫,意味著**函式是c語言的**,所以直接使用libuv網路訊息**,相關物件必須是全域性的或者static物件,這是令人難以容忍的。這裡通過libuv的使用者資料功能實現了c++風格的**,**函式可以類成員函式,或者lambda。同時封裝了tcpserver及tcpclient等類,簡化程式設計。

2.對執行緒安全做了優化

libuv是乙個非執行緒安全的庫,跨執行緒傳送資料數不允許的。uv-cpp中實現了執行緒安全的跨執行緒write資料操作。基於libuv的async非同步機制實現,同時在跨執行緒呼叫時候會檢查當前呼叫執行緒,如果在該loop執行緒中則直接傳送,減少了不必要的效能損耗。實現如下:

void uv::eventloop::runinthisloop(const std::function& func)

async_->runinthisloop(func);

}

同時libuv的aysnc介面存在多次呼叫只執行一次的可能(特性),比如有些操作需要在**裡面釋放資料,這樣就會記憶體洩漏。uv-cpp中的async類優化這個問題,確保每次呼叫一定會被執行。

3.實現了定時器及時間輪

對libuv定時器做了一層封裝,並實現了乙個時間複雜度o(1)的時間輪,用於檢測心跳超時。

4.實現整包傳送/接受協議機制

實現了listbuffer和cyclebuffe兩種快取機制,用於解決tcp的粘包及殘包。資料會重新組成完整的包資料用於讀取。效能測試顯示cyclebuffe會損失20%~30%的效能。

5日誌介面

uv-cpp沒有實現日誌功能,但是保留了介面,可以註冊/繫結到自定義日誌庫中使用。

詳見example資料夾:

發布乙個C編寫的Ping類

cping.h ping.h inte ce for the cping class.if defined afx ping h 2ebf2c11 a0a3 403b 9eb2 1905cff8ee58 included define afx ping h 2ebf2c11 a0a3 403b 9e...

自己編寫並發布乙個Vue元件

自己編寫並發布乙個vue元件 1.幾種開源協議的介紹 2.開始編寫元件 新建plugin資料夾 指定 元件 入口檔案和package.json檔案,看一下各個檔案內容 1.package.json 是npm init生成的 2.loading.vue 是編寫的元件檔案 在loading.js中,使用...

編寫乙個makefile

什麼是makefile?對於大多數的windows程式設計師來講,makefile可能不是那麼重要,因為windows的ide都為程式設計師做好了這個工作。但是在linux下程式設計,會不會寫makefile,從側面上說明乙個人是否具備完成大型工程的能力。makefile的作用 makefile是用...