有什麼適合提高 C/C++ 網路編程能力的開源項目推薦?
首先 C 和 C++ 是完全不同的技能,所以不好混在一起談。且說到 C++,我們先假設不是指 C++11 或 C++14,因為它們也幾乎可以說是不同的語言。
其次,我假設問這個問題的追求是已經有一定C/C++基礎後的進階。因為成熟的項目都結構都已經很複雜了,並不適合初階選手。對於剛入門不久的同學,最好的方式是到 GitHub 按語種搜索後,選代碼行數和文件數比較少又比較高評價的項目看就好。找成熟項目代碼來鑽的方法並不適合每個人。
進入正題,對於C來說,推薦3個分類:
* GNU工具系列:這類工具比較小,歷史比較悠久。挑一些小塊頭的來簡單看看,應該是不錯的。* libCURL:如果只是從Client的角度,特別是想學習HTTP請求,看這個就對了。
* nginx:個人認為是所有C代碼中最棒的。進階最佳選擇,如果能完全吃透可以所向披靡。* php:單從網路層來說伐善可陳,不過其ext擴展模塊的設計方式,解釋語言的思路,還是很經典的C實現。對於C++來說,可以推薦的項目比較少,因為C++自己是有硬傷的。又因為這些硬傷,最近幾年C++標準的變化(進化)又非常大:* mongodb: 還可以* boost asio: 所有boost源碼應該說都是C++的實用精華,都值得一讀註:C++的未來是C++11,所以目前C++的奇技淫巧都可以放一邊的。面向未來直接看C++11-14的library是不錯的選擇。看到這麼多人推薦的項目都是很多人知道的項目,我推薦一個比較小眾的:
SPServer : 一個基於線程池(包括HAHS和LF)的高並發 server 框架N年前看到這篇文章的時候主動聯繫了作者,後來成了現實中的好朋友.
這個項目是他最開始學習網路編程時的作品,後來已經不做維護,實現了reactor/proactor的網路模式.
- Webbench是一個在linux下使用的非常簡單的網站壓測工具。它使用fork()模擬多個客戶端同時訪問我們設定的URL,測試網站在壓力下工作的性能,最多可以模擬3萬個並發連接去測試網站的負載能力。Webbench使用C語言編寫, 代碼實在太簡潔,源碼加起來不到600行。下載鏈接:GitHub - EZLippi/WebBench
- Tinyhttpd是一個超輕量型Http Server,使用C語言開發,全部代碼只有502行(包括注釋),附帶一個簡單的Client,可以通過閱讀這段代碼理解一個 Http Server 的本質。下載鏈接鏈接:GitHub - EZLippi/Tinyhttpd
- 高性能web伺服器nginx: download
- C語言寫的事件驅動框架libevent/libevent · GitHub
- ACE:C++面向對象網路變成工具包
- Boost.Asio:用於網路和底層I/O編程的跨平台的C++庫
- Casablanca:C++ REST SDK
- cpp-netlib:高級網路編程的開源庫集合
- Dyad.c:C語言的非同步網路
- libcurl :多協議文件傳輸庫
- Mongoose:非常輕量級的網路伺服器
- Muduo :用於Linux多線程伺服器的C++非阻塞網路庫
- net_skeleton :C/C++的TCP 客戶端/伺服器庫
- nope.c :基於C語言的超輕型軟體平台,用於可擴展的伺服器端和網路應用。 對於C編程人員,可以考慮node.js
- Onion :C語言HTTP伺服器庫,其設計為輕量級,易使用。
- POCO:用於構建網路和基於互聯網應用程序的C++類庫,可以運行在桌面,伺服器,移動和嵌入式系統。
- RakNet:為遊戲開發人員提供的跨平台的開源C++網路引擎。
- Tuf o :用於Qt之上的C++構建的非同步Web框架。
- WebSocket++ :基於C++/Boost Aiso的websocket 客戶端/伺服器庫
- ZeroMQ :高速,模塊化的非同步通信庫
這個網站整理的比較全,可以看看ezlippi.com 的頁面
另外編寫高性能web伺服器當然離不開緩存啦,可以關注下Redis和Memcached.偏重應用層協議: nginx,named, dcerpc, net-snmp,loudmouth,
偏重傳輸層: sendip, FreeBSD TCP stack庫: FreeBSD evlib, glib, libcrul, Posix 通用介面 和 linux內核的epoll。 以上都為C, 典型C++的不多,推薦一個rTorrent. 以上皆為研究過,保證一般意義上的品質。nginx,這麼經典的,網路編程的教科書了
只讀過libevent,感覺libevent的代碼都比較精簡,會linux c,讀過apue,unp的內容就可以看了,5天左右就讀完了,感覺很適合我這菜鳥學習,目前在用C++仿造libevent~
反對一開始就去看框架,大部分人只會誤入歧途。
初學者我建議先看mini-httpd, 然後再看lighttpd。
如果要學習協議的狀態機,建議去學習busybox的udhpcd。
然後去看dhclinet。win32下有Dual DHCP DNS Server。要學習大型協議處理,建議去看一下Net-snmpd,它有unix-like和win32的多平台版本。
如果要學習搞高性能的原理,那麼可以去看nginx,memcached。
到了這裡,還要提高性能,基本就不單是用戶空間(user-space)的事情了。學習曲線會突然變陡。
你要開始考慮,負載均衡,網路延遲,硬體性能,介面性能,處理器管理,甚至是cache級別的優化。libevent。memecached, redis
如果樓主問的是網路編程,而不是網路框架。那麼 redis是最適合學習的,一個簡單的 tcp server,再加一個 reactor。如果想了解到更深入包括網路內核那麼必須是nginx的網路模塊。
lighttpd,apache。memcached比較小,容易研究點
陳碩的muduo不錯
best c network io library:libuv best cpp network library:asio
雲風有一個skynet裡面有一個epoll封裝
網路編程推薦陳大大的muduo網路庫,核心代碼行數也就5000行左右,例子非常詳細;
github地址:chenshuo/muduo
附帶還有一本書《Linux多線程服務端編程》,記得多寫代碼實踐!
有一個開源社區叫做avplayer,有興趣的話可以去看看,我知道裡面用到的基本上就是boost的一些網路編程呢
muduo,的確不錯,看過netty跟nio的一些api再看muduo覺得熟悉好懂,muduo的代碼本身質量也相當棒。
多進程: Nginx多線程: memcached單線程: Redis另外,muduo(現代C++),配合書一起學習,書中有很多工程經驗談。
如果自己的工作也是網路服務開發的話就更好了。可以看看libevent,muduo個人感覺太過於炫技了。自己學著寫一個更棒了。
推薦 muduo . 我就是從這個起步的(需要有c++基礎,讀過unp).
可恥的安利一個自己寫的key-value存儲系統的實現,帶有客戶端和伺服器端,使用了很多網路編程方面的內容。代碼量也不大,最主要能讓初學者快速動起手來實踐,練練手還是很不錯的。https://github.com/zinx2016/Explorer
推薦閱讀:
※那些開源軟體真的會有人去閱讀嗎?
※開源軟體的開發是如何進行的?
※為什麼很多開源軟體都用 C,而不是 C++ 寫成?
※軟體開源後,能否有開源和商業化兩種授權?