請問有哪些適合網路編程初學者的C語言方面的網路編程開源項目,希望學習後能參與到該項目中?


有哪些適合學生參與的 C++,網路編程方面的開源項目?

有什麼適合提高 C/C++ 網路編程能力的開源項目推薦?


可以看nginx,代碼清晰。

另外,可以看一下libev,只有幾千行代碼,不過你要習慣它的風格,稍微有點怪。

以上我都讀過。


互聯網的興起讓網路程序有了長足的發展,讓我們可以通過網路編程在程序中實現計算機的通信。舉個栗子,當你使用瀏覽器訪問碼雲時,你的計算機就和碼雲的某台伺服器通過互聯網連接起來了,然後,碼雲的伺服器把網頁內容作為數據通過互聯網傳輸到你的電腦上。

對於 C++ 網路編程的初學者,推薦下面 6 款還算不錯的開源項目,供大家一起交流學習。

1. 項目名稱:基於C++11 的高性能網路伺服器 evpp

項目簡介: evpp 是一個基於 libevent 開發的現代化 C++11 高性能網路伺服器,自帶 TCP/UDP/HTTP 等協議的非同步非阻塞式的伺服器和客戶端庫,具有如下特性:

  • 現代版的 C++11介面
  • 非阻塞非同步介面都是 C++11 的 functional/bind 形式的回調仿函數(不是 libevent 中的C風格的函數指針)
  • CPU 多核友好和線程安全
  • 非阻塞純非同步多線程 TCP 伺服器/客戶端
  • 非阻塞純非同步多線程 HTTP 伺服器/客戶端
  • 非阻塞純非同步多線程 UDP 伺服器
  • 支持多進程模式
  • 優秀的跨平台特性和高性能(繼承自 libevent 的優點)
  • 已經經過詳盡的測試,並已經用於生產環境,每天承載數萬億次的網路通信
  • 非常容易安裝和集成,evpp 能夠很容易就打包出 deb/rpm/tar.gz 等格式的安裝包

項目地址:zieckey/evpp - 碼雲 Gitee.com

2. 項目名稱:基於 C++11 的輕量級網路框架

項目簡介: 本項目是一個基於 C++11 的輕量級網路框架,基於線程池技術可以實現大並發網路 IO。項目主要的功能特性包括:

網路庫:

  • tcp/udp客戶端,介面簡單易用並且是線程安全的,用戶不必關心具體的 socket api 操作。
  • tcp 伺服器,使用非常簡單,只要實現具體的 tcp 會話(TcpSession 類)邏輯,使用模板的方式可以快速的構建高性能的伺服器。
  • 對套接字多種操作的封裝。

線程庫:

  • 使用線程實現的簡單易用的定時器(AsyncTaskThread)。
  • 讀寫鎖。
  • 自旋鎖。
  • 線程組。
  • 簡單易用的線程池,可以非同步或同步執行任務,支持 functional 和 lambad 表達式。

工具庫:

  • 支持顏色高亮、代碼定位、非同步列印。
  • 基於智能指針的循環池,不需要顯式手動釋放。
  • 環形緩衝,支持主動讀取和讀取事件兩種模式。
  • 簡單易用的 ssl 加解密黑盒,支持多線程。

項目地址:夏楚/ZLToolKit - 碼雲 Gitee.com

3. 項目名稱:基於 socks4/5 的代理伺服器實現

項目簡介: 本項目是一個支持 socks4/5 udp 代理協議的 socks 代理伺服器實現。

項目地址:Jack.arain/socks_server - 碼雲 Gitee.com

4. 項目名稱:基於 C++ 的網路通信庫及伺服器編程框架

項目簡介: acl 工程是一個跨平台(支持LINUX,WIN32,Solaris,MacOS,FreeBSD)的網路通信庫及伺服器編程框架,同時提供更多的實用功能庫。通過該庫,用戶可以非常容易地編寫支持多種模式(多線程、多進程、非阻塞、觸發器、UDP方式、協程方式)的伺服器程序,WEB 應用程序,資料庫應用程序。此外,該庫還提供了常見應用的客戶端通信庫(如:HTTP、SMTP、ICMP、redis、memcache、beanstalk、handler socket),常見流式編解碼庫:XML/JSON/MIME/BASE64/UUCODE/QPCODE/RFC2047 etc。

項目地址:acl-dev/acl - 碼雲 Gitee.com

5. 項目名稱:基於協程的 C++ 網路開發框架

項目簡介: 本項目是一個基於協程的C++網路開發框架.

主要的特點

  • 跨平台:同時支持 Linux32/64、OSX64 兩個平台,支持 C++11及以上;
  • 易開發:同步的方式編寫代碼,支持類Mina的filter過濾鏈、簡單而不失強大;
  • 高性能:可同時處理海量連接,框架無鎖設計,性能超群;
  • 多特性:代碼同步調用方式、支持網路過載保護、支持空閑連接自動清理等企業級特性;

項目地址:cxxjava/CxxConet - 碼雲 Gitee.com

6. 項目名稱:簡潔易用的 C++11 網路庫

項目簡介: 本項目是一個簡潔易用的 C++11網路庫,主要特性如下所示:

  • 支持單機千萬並發連接
  • 多平台支持
  • 支持優雅退出
  • 高性能
  • 支持半同步半非同步處理
  • openssl 支持
  • protobuf 支持
  • udp 支持

項目地址:yedf/handy - 碼雲 Gitee.com

碼雲 http://Gitee.com

發現更多優質開源項目:最新推薦 - 碼雲 - 開源中國

團隊流暢、高效開發:碼雲企業版 - 碼雲 - 開源中國


HTTP server 的話可以看最早幾個版本的 flask,代碼簡單邏輯清晰,當然最重要的還是有需求。

網路編程嘛,最怕發明了新協議找不到合適的應用了。自己玩票始終不是長久之道。

—-

用哪門語言跟網路編程沒關係,真的。非要用 C 結果跑去看了某資料庫就得不償失了。謹記你是學網路編程,不是學資料庫呀。

突然發現這個問題是四年前問的,借這個回答也回憶一下自己的學習過程吧。

四年前剛開始看 flask

三年前以為 REST API 就是未來

兩年前開始接觸以 protobuf 為基礎的一系列 RPC 框架 基於內核的 tc netfilter 各種魔改過的 TCP/IP 協議棧

一年前開始配交換機配網卡搞乙太網 RDMA

現在覺得自己依然是個網路編程的初學者,扶我起來,我還能戰

重點一直都是應用,無應用則網路無價值,這是時刻需要牢記的。


菜鳥不適合通過開源項目來學習,所以答案是沒有


贊同 @Liutos的觀點。

閱讀源碼需要有針對性,不論是架構還是實現細節至少都要有個具體的目標。

初學者經驗不足看架構不現實,而好的開源代碼的實現是生產環境可依賴的,對某個代碼片段所隱含的知識點,初學者是很難察覺的,更何談吸收。

發現問題,思考問題,嘗試自己實現,在去翻巨人的實現,反嚼改進,站在他們的肩膀上成長。


可以讀一下redis的源代碼,相對於nginx來說,redis源代碼閱讀起來更簡單,而且也不多,主要是看下他對socket的管理,tcp流的處理,以及他是在單線程下面如何做到如此高效的。


如果是學習的話我推薦你去看看Linux、FreeBSD 系統中與網路有關的那些命令程序的代碼,比如ping、tcpdump等等,他們還有很多更強大的開源替代方案,比如mtr,都是學習的好材料。這些程序都追求把一件事情做到極致,所以往往結構清晰卻又不會過於簡單,你看看光是下載就有wget和curl兩大神器夠你折騰了。

Linux和FreeBSD的這類自帶命令雖然功能相同,但往往實現方式有很大差別,對比閱讀效果甚好。

但是這些簡單工具一般參與度不高,如果樓主真想參與,那等能力提升之後又會使用C++的話,目前Node.js無疑是最活躍的網路項目了。


假如不以菜鳥自居,歡迎參考:Linux.org


c項目 可以看看 tboox/tbox


FreeSWITCH,跨平台,大部分代碼基於APR,看起來比較清晰。但無論看什麼項目的代碼,首先要學會怎麼用看起來才比較方便 。


很少單純的網路開源項目,大多是跟具體協議相關的,比如sip,http等。所以比較好的方式是先熟悉bsd socket的api,寫一些簡單的demo程序。其實比較好的是boost 的asio,這個是c++的。


具體項目我倒是不太了解,但是現在開源最活躍的項目託管網站應該是GitHub,你可以到上面搜索C語言的項目,clone代碼到本地先看看。

如果真的覺得自己是菜鳥的話,暫時不要有參與到已有的開源項目這樣的想法,起碼短期內應該不太可能實現,先抱著學習的態度自己做些東西。


推薦閱讀:

Android平台有哪些開源的社交APP可供研究?
那麼多人在github上傳代碼,不會塞滿嗎?
有哪些適合學生參與的 C++,網路編程方面的開源項目?
怎樣學習遊戲引擎開源代碼提升自己?
程序員如何加入到開源項目中去?

TAG:開源項目 | 網路編程 |