1. 程式人生 > >C#高效能大容量SOCKET併發(一):IOCP完成埠例子介紹

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,其中速率計算有可能存在偏差,因為傳到最後,併發數會變小,造成整個的速率上升,可以作為效能測試的參考。


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

相關推薦

C#高效能容量SOCKET併發IOCP完成例子介紹

例子主要包括SocketAsyncEventArgs通訊封裝、服務端實現日誌檢視、SCOKET列表、上傳、下載、遠端檔案流、吞吐量協議,用於測試SocketAsyncEventArgs的效能和壓力,最大連線數支援65535個長連線,最高命令互動速度達到250MB/S(使用的

C#高效能容量SOCKET併發超時Socket斷開守護執行緒和心跳包

守護執行緒 在服務端版Socket程式設計需要處理長時間沒有傳送資料的Socket,需要在超時多長時間後斷開連線,我們需要獨立一個執行緒(DaemonThread)來輪詢,在執行斷開時,需要把Socket物件鎖定,並呼叫CloseClientSocket來斷開連線,具體

C#高效能容量SOCKET併發程式碼結構說明

AsyncSocketServer:服務入口,建立Socket監聽,負責接收連線,繫結連線物件,處理非同步事件返回的接收和傳送事件;m_asyncSocketUserTokenPool是管理所有空閒的AsyncSocketUserToken,採用棧的管理方式,後進先出;m_asyncSocketUserTok

Netty高效能容量Socket併發Netty效能測試

public class NettyCommandHandler extends ChannelHandlerAdapter { private int counter = 0; @Override public void channelRead(ChannelHandlerCont

高效能容量SOCKET併發接收、傳送、快取

接收 完成埠是結合重疊埠一起使用的,在接收資料之前,我們需要投遞一個接收請求,使用function WSARecv(s: TSocket; lpBuffers: LPWSABUF; dwBufferCount: DWORD;  var lpNumberOfBytesRec

C#高效能容量SOCKET併發完成例子C#客戶端完整例項原始碼

遙望星空 好好幹,有前途! 部落格園 首頁 新隨筆 聯絡 管理 訂閱 隨筆- 1082  文章- 0  評論- 151  C#高效能大容量SOCKET併發(轉) C#高效能大容量SOCKET併發(零):程式碼結

Netty高效能容量Socket併發

Netty效能測試 Netty是由JBOSS提供的一個Java開源框架。Netty提供非同步的、事件驅動的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。Netty 是一個基於NIO的客戶,伺服器端程式設計框架,使用Netty 可以確保你快

Netty高效能容量Socket併發

Netty簡介 Netty是由JBOSS提供的一個Java開源框架。Netty提供非同步的、事件驅動的網路應用程式框架和工具,用以快速開發高效能、高可靠性的網路伺服器和客戶端程式。和傳統BIO不同,NIO是非阻塞的,和傳統BIO不同,NIO相當於是執行緒池方式的BIO,相

Java併發volatile的實現原理 Java併發Java記憶體模型乾貨總結

synchronized是一個重量級的鎖,volatile通常被比喻成輕量級的synchronized volatile是一個變數修飾符,只能用來修飾變數。 volatile寫:當寫一個volatile變數時,JMM會把該執行緒對應的本地記憶體中的共享變數重新整理到主記憶體。 volatile讀:當讀一

資料之scala --- 安裝scala,簡單語法介紹,條件表示式,輸入和輸出,迴圈,函式,過程,lazy ,異常,陣列

一、安裝和執行Scala解釋程式 --------------------------------------------- 1.下載scala-2.11.7.msi 2.管理員執行--安裝 3.進入scala/bin,找到scala.bat,管理員執行,進入scala命

資料架構簡述資料的本質

1.大資料是什麼 大資料由SCI的首席科學家JohmR.Masey於1998年在USENIX大會上首次提出。他在其發表的一篇名為Big Dara and the Next Wave of Infras

C++ STL開發溫習與總結 1.C++程式設計技術

 C++ STL開發溫習與總結(一):1.C++程式設計技術       使用了多年C++,沒有系統的溫習總結過,所以準備溫習《C++STL程式設計師開發指南》,本系列篇章將會是溫習總結該書本概念和技術點。 1概論 l  C++語言是基於C語言的語法基礎上融入了其他語

c++並發編程基礎並發、並行域多線程

競爭 安全 開發 引用 詳解 輕量 事情 地址空間 var 正文 C++11標準在標準庫中為多線程提供了組件,這意味著使用C++編寫與平臺無關的多線程程序成為可能,而C++程序的可移植性也得到了有力的保證。另外,並發編程可提高應用的性能,這對對性能錙銖必較的C++程序員來

c++迭代器詳解back_inserter, front_inserter,inserter

1.stl迭代器之配接器( Iterator Adapters) 迭代器(Iterators)是一個純抽象的概念:任何東西,只要其行為類似迭代器,它就是一個迭代器.也就是說,只有具備有迭代器的四種基本操作:取值(*),遞增(++) 比較(== !=) 賦值(=)它就是迭代器

c++11多執行緒程式設計建立執行緒的三種方法

c++11執行緒庫原始的c++標準僅支援單執行緒程式設計,新的c++標準(c++11或c++0x)於2011年釋出,引入了新的執行緒庫。 編譯器要求 Linux: gcc 4.8.1 (完全併發支援) Windows: Visual Studio 2012 and Min

和朱曄一起復習Java併發執行緒池

和我之前的Spring系列文章一樣,我們會以做一些Demo做實驗的方式來複習一些知識點。 本文我們先從Java併發中最最常用的執行緒池開始。 從一個執行緒池實驗開始 首先我們寫一個方法來每秒一次定時輸出執行緒池的基本資訊: private void printStats(ThreadPoolExecutor

Apache Rewrite重寫模組一個入門的例子

做網站開發這麼長時間,對於Apache 的 Rewrite 重寫功能一直沒有深入學習,大多時候僅限於 RewriteRule規則的簡單使用。這篇文章只是本人的一些測試與總結,有誤也正常。 入門例子 <IfModule mod_rewrite.c> Rewri

Kaggle八門神器競賽神器之XGBoost介紹

Xgboost為一個十分有效的機器學習模型,在各種競賽中均可以看到它的身影,同時Xgboost在工業屆也有著廣泛的應用,本文以Titanic資料集為研究物件,簡單地探究Xgboost模型建模過程,同時對資料清理以及特徵工程的內容作簡單的介紹,以此作為Xgboost模型的學習筆記,錯誤和不足之處還請各位看官指出

GUN C中的socket學習

ipp 區分 如果 raw 文件表 一起 通訊 res 概念   socket是用於通信的工具。   套接字其實是一個廣義上的進程間通信的信道。就像pipe一樣,在GUN環境下socket也被用一個文件表示。不同的socket文件可以用於不同的進程間通信,甚至可以用來在網絡

資料之storm --- storm簡介,核心元件,工作流程,安裝和部署,電話通訊案例分析,叢集執行,單詞統計案例分析,調整併發

一、storm簡介 --------------------------------------------------------- 1.開源,分散式,實時計算 2.實時可靠的處理無限資料流,可以使用任何語言開發 3.適用於實時分析,線上機器學習