C#高性能大容量SOCKET並發(一):IOCP完成端口例子介紹


例子主要包括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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM