C#高效能大容量SOCKET併發(一):IOCP完成埠例子介紹

weixin_33912246發表於2017-07-27

例子主要包括SocketAsyncEventArgs通訊封裝、服務端實現日誌檢視、SCOKET列表、上傳、下載、遠端檔案流、吞吐量協議,用於測試SocketAsyncEventArgs的效能和壓力,最大連線數支援65535個長連線,最高命令互動速度達到250MB/S(使用的是127.0.0.1的方式,相當於千兆網路卡1Gb=125MB/S兩倍的吞吐量)。服務端用C#編寫,並使用log4net作為日誌模組;客戶端使用DELPHI編寫,和以前的DELPHI版完成埠共用一個客戶端,提供C#版的上傳客戶端。

 

C#版完成埠具有以下特點:

 

  • 連線線上管理(提供線上連線維護,連線會話管理,資料接收,連線斷開等相關事件跟蹤);
  • 傳送資料智慧合併(元件會根據資源使用情況,對多個同時傳送向同一連線的多個訊息資料進行合併寫入緩衝區;
  • 記憶體池管理(提供一系列的接收和傳送buffer可複用池);
  • 資料讀寫封裝;
  • 通訊協議封裝;

 

由不同的類負責實現,比MSDN的例子程式碼多了不少邏輯,為了方便大家閱讀和理解,把整體類框架設計整體如下。

類結構圖

 

 

服務端

服務端是一個控制檯程式,支援分顏色顯示日誌,介面截圖如下:

客戶端

用於對服務端進行效能測試,實現了吞吐量測試協議,還有日誌、檢視客戶端、上傳、下載、遠端檔案流五個應用層協議,可以作為要實現其他協議的例子參考,其中遠端檔案流可以作為分散式系統的底層資料互動模組,介面截圖如下:

暫不提供NET的客戶端,NET的介面程式設計還在學習中,非常抱歉。

效能測試結果

支援65535個長連線,為了支援65535個連線,需要把程式用64位進行編譯。

迴圈發包網路流量可以達到250MB/S,受限於是網路卡流量,千兆網路卡最大1Gb=125MB/S,為了測試最大吞吐量,我們需要把客戶端和伺服器放在同一臺電腦上,使用127.0.0.1這個IP測試,127.0.0.1是本機回送地址(Loopback Address),即主機IP堆疊內部的IP地址,主要用於網路軟體測試以及本地機程式間通訊,無論什麼程式,一旦使用回送地址傳送資料,協議軟體立即返回,不進行任何網路傳輸。

其中截圖如下:

按檔案上傳下載對伺服器進行應用層速率測試,分為1、16、64、256個併發進行測試,發包大小分1、2、4、8、16、32、64、128、256、512、1024KB,測試結果彙總如下,其中最高速率達到250MB/S,綜合最優發包大小為16、32KB,其中速率計算有可能存在偏差,因為傳到最後,併發數會變小,造成整個的速率上升,可以作為效能測試的參考。

 

 

DEMO下載地址:http://download.csdn.net/detail/sqldebug_fan/7467745

免責宣告:此程式碼只是為了演示C#完成埠程式設計,僅用於學習和研究,切勿用於商業用途。水平有限,C#也屬於初學,錯誤在所難免,歡迎指正和指導。郵箱地址:fansheng_hx@163.com。

相關文章