跨平台網路庫Cyclone

2021-08-20 12:30:31 字數 2106 閱讀 8259

**:

非常好用,原始碼:

posted on 2023年5月11日

by jinchao

這個工程我放在了github上,cyclone的設計從一開始就是比較清晰的,主要是以下幾個特性

這應該是使用最為廣泛的一種網路模型,適合大多數應用場景,multiplexing支援select、epoll、kqueue三種api

目前支援windows、linux、macosx、android,後面會考慮支援ios,因為用了很多c++11特性,所以跨平台並不是什麼太麻煩的事情,主要的跨平台的差異還是在於eventloop中針對不同平台的實現,cyclone的eventloop支援socket,timer,pipe三種喚醒機制,其中pipe的實現在linux和mac上都有原生的支援,在windows上雖然也有pipe,但無法用在select上,所以我用了一對socket來模擬pipe,這個消耗會有些高,所以在windows的生產環境裡盡量慎用pipe。timer在mac上使用了kqueue原生機制,linux和android使用了timerfd,windows上使用了timer-queue + pipe的方式。

cyclone使用cmake作為編譯指令碼,以及單元測試程式,如果需要編譯單元測試的話,需要安裝google test

cyclone的設計思想是寧缺毋濫,盡量保證庫的簡單,比如訊息包的封裝,加解密這樣的**是以工具的形式放在庫里,我已經把dh-exchange金鑰交換和aes加密放在庫里,可以實現通訊雙方的安全協議,另外adler32可以做簡單的crc校驗演算法,xorshift128做異或加密。

1

2 ./

socks5-p

1984

./relay_server-uh

127.0.0.1-up

1984-p

3000

在本地機器上執行relay_local

然後設定本地瀏覽器使用127.0.0.1:1984作為socks5**伺服器位址即可,比如chrome瀏覽器,加入命令列引數–proxy-server=」socks5:或者使用pac檔案設定複雜的**設定,感興趣的同學這部分可以研究一下shadowsocks,shadowsocks使用的是http**+加密協議,基本原理和我的是一樣的,不過更完善和專業。

除了n:1和1:n,我還提供了乙個1:1的工具relay_pipe。這個程式如同水管中的管件,兩端可以是listen和connect兩種方式的組合,如同螺栓和螺母一樣,這三個工具組合起來,可以實現一些很有趣的功能,比如實現區域網的穿透。舉例來說,公司區域網內有一台ftp伺服器,如果想在家的時使用,一般情況下可以找mis的同事開通vpn許可權,不過對於臨時應急使用的話,完全可以直接用relay組合乙個管道,把家裡的電腦鏈結到公司內網的伺服器上,前提是有一台公網上的vps伺服器。

首先是在公網vps上執行乙個中轉pipe,開啟兩個監聽埠2001和2002

1 ./

relay_pipe-p1

2001-p2

2002

在公司區域網找一台電腦,執行relay_server和relay_pipe

1

2 ./

relay_server-uh

[ftp_ip]-

up21-p

3000

./relay_pipe-p1

127.0.0.1

:3000-p2

[vps_ip]:

2001

在家裡的電腦上執行relay_local

1 ./

relay_local-uh

[vps_ip]-

up2002-p

21

然後就可以在家裡的電腦上鏈結127.0.0.1:21使用ftp,如同在公司一樣。

跨平台網路傳輸系統

現有網路主要是基於tcp ip的。tcp和udp特點使很多專案的決策很艱難。tcp特點 使用簡單可靠,但在很多情況下有它的侷限性。比如 延時大。在網路質量比較差情況下速度上不去。穿nat能力差。資料非面向事務的。傳送方幾次send的資料被接收方乙個recv返回,反之還有資料被切割現象 中國的網路環境...

跨平台網路通訊與伺服器程式設計框架庫(acl庫)介紹

acl 工程是乙個跨平台 支援linux,win32,solaris,macos,freebsd 的網路通訊庫及伺服器程式設計框架,同時提供更多的實用功能 庫。通過該庫,使用者可以非常容易地編寫支援多種模式 多執行緒 多程序 非阻塞 觸發器 udp方式 的伺服器程式,web 應用程式,資料庫應用程式...

C 跨平台網路伺服器物件導向實現

訊息標頭檔案messageheader.hpp ifndef messageheader hpp define messageheader hpp enum cmd 訊息頭 struct dataheader struct login public dataheader char username ...