有沒有哪些高效的c++ socket框架?

就像php的swoole一樣,有沒有哪些成熟的c++ socket框架,擁有非同步,協程及跨平台特性的。希望知乎大佬指教一下。因為我有個聊天軟體的項目,需要用到c++ socket server和client。


既然邀請到了我,而且要求是跨平台,那我只能推薦我自己的C++網路庫:

IronsDu/brynet

特點是效率高,使用方便安全,還支持SSL、HTTP、WebSocket。

文檔逐步補全中:https://github.com/IronsDu/brynet/blob/master/docs/main.zh-cn.md

不過需要C++11編譯器支持(gcc4.8+,VS2013+)

當然唯一不能滿足你的是沒有協程(想簡單支持,加入我那個協程庫也不難,但難免有坑),我個人一直覺得C++里跑協程不太好,總有不滿意的地方,因此我不太想用。你真的很看重協程的話,那就用golang 吧(當然我也有一個基於brynet的Lua同步API網路庫)


libuv?


boost::asio ?前提是你能用得高效


HP-Socket


果然人人都有一顆造輪子的心。

介紹下我自己的網路庫:Metazion,跨平台,介面簡單清晰,不過沒有實現協程等,也沒有複雜特性,只是單純的網路通信功能,經受過生產環境的檢驗。

編譯可以使用CMake構建相應工程,使用了很多C++11之上的特性。

使用示例可以參考另一個項目:MetazionWorld

最重要的是,我覺得自己的代碼質量很高,很漂亮,哈哈哈哈。


我這邊網路層主要是基於 boost::asio 開發的,性能一流,開發速度飛快,可以比自己從頭開始做節約大量的代碼,也需要嚴格的測試,因為要填少量的坑.

能夠完整理解asio的話,那麼,asio就是最好的選擇,asio庫的開發者是這個時代最棒的程序員.

我們的產品基於asio庫做底層,最終基於C++庫的memcache查詢性能比基於C語言庫的memcache性能高70%,另外, 我們擴展了boost::asio::io_service, 實現了void yield(void) 函數用於微線程任務切換,實現了基於stackless的完整微線程架構.我們測試網路層的性能已經超越了很多網路庫.

真正實現一個完整的最高性能的網路層,可能需要超過數萬行代碼,實現很多小的基礎架構,然後爭取每個組件都是最佳實踐。

首先要實現微線程/協程架構,微線程分為stackful和stackless兩種,目前開源基本都是stackful的,其中 知乎 @朱元 目測是在stackful 領域中最牛的大牛,開源軟體,值得學習。我這邊是實現stackless的微線程,理論上推測可以有更大的性能潛力,stackless不需要棧的切換,所以理論性能更高,stackless架構目前沒有完整的開源架構。我廠是完全自研的,當時是看重了該模型的理論推測性能更高,實現難度也更高,各公司均保密。僅僅是微線程架構,也需要不少的代碼量。
微線程架構減少了線程切換的開銷,性能會比傳統網路層架構高不少。

多線程之間免不了數據交換,典型的就是隊列,傳統的隊列是有鎖隊列,這個是第一代隊列。更先進的就是基於cas指令的lock_free隊列,性能要高不少,開源軟體有不少,這個是第二代產品。最先進的第三代隊列就是雙端同時並發的無等待wait_free架構,wait_free架構沒有完整的開源實現,比以前的產品快很多,性能超高,單生產者單消費者隊列每秒3億,各公司均保密。我廠這部分代碼wait_free架構超過5000行代碼,實現了多生產者和多消費者模型無等待大並發模型。

多線程下必須使用智能指針,智能指針第一代就是類似std::shared_ptr這種,又引入make_shared打了個性能補丁,快了一些。std::shared_ptr不是完全線程安全的。第二代智能指針std::atomic_shared_ptr目測c++20會引入,正在討論中,實現了完全線程安全。其實第二代智能指針很多公司早都在用了,一些遊戲公司十年前就都在使用自研的更安全的產品,完全線程安全。我廠也研發實現了第二代智能指針,性能高一倍,完全線程安全,並進一步實現了第三代智能指針,完成了類似java gc功能,但是比java更快的模型,減少了析構的開銷,使得使用智能指針比裸指針更高的性能,並且使用方法上與std::shared_ptr一樣,全兼容第一代智能指針,第二代第三代智能指針技術各公司都保密。

以上略談了一些公司研發網路層的內部小模塊,類似有很多這樣的模塊組合,最終實現高性能產品。


https://github.com/scylladb/seastar


本人一直在用libuv,簡單快速有效
boost的asio也不錯,可我實在不喜歡為了這一點功能就引入boost那麼一大坨………………


  • Boost.Asio - 1.65.1
  • Overview | POCO C++ Libraries
  • Qihoo360/evpp

推薦asio


chromium里的net模塊


首推asio
要是你c++沒那麼好,那就用libevent吧。
其餘的沒用過不推薦了。


推薦閱讀:

Socket建立連接到底發生了什麼?
怎麼理解TCP是面向連接的,HTTP基於TCP卻是無連接的?
服務端把客戶端幾次發的數據一起接受了,是怎麼回事?socket,Tcp協議
TCP中已有SO_KEEPALIVE選項,為什麼還要在應用層加入心跳包機制??
TCP面向位元組流和報文段的關係是什麼?

TAG:C | 非同步IO | CC | Socket | 協程 |