有什麼適合提高 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++ 寫成?
軟體開源後,能否有開源和商業化兩種授權?

TAG:開源軟體 | 編程 | C編程語言 | 開源 | 開源項目 | C | 網路編程 |