2014-03-30 68 views
0

我在C#中創建了一個服務器,並試圖高效地處理來自客戶端的數據。我現在有一個客戶端線程檢查客戶端分組此代碼:高效的數據包處理?

if (myStream.DataAvailable == true && myStream.CanRead) { 
    int mySize = myStream.ReadByte(); 
    myBuffer = new byte[ mySize ]; 
    await myStream.ReadAsync(myBuffer, 0, mySize); 
    ushort myPeek = 0; 
    Net_Messages.Net_Read(myStream, myID, myBuffer, myPeek, myThreading); 
} 

所以我的問題是,是否有效地從數據流中的數據存儲到從每個客戶端收到的每個數據包緩衝區?我應該有一個固定的預定義緩衝區,而不是爲每個數據包檢索創建一個新緩衝區?

我該怎樣寫數據呢?爲每個客戶端創建一個固定的預定義緩衝區,將數據存儲在該緩衝區併發送緩衝區?

我與預先定義的緩衝區問題是分配是不需要通過創建一個不必要的大小的緩衝區,如果我能在正確的大小爲每個數據包的新緩衝區額外的內存。

注:Net_Read是一個簡單的穿過函數經過緩衝,並根據需要處理接收到的分組額外的信息。

回答

1

您當然不應該爲每次讀取分配新的緩衝區,如果這是您的意思。但除此之外,這取決於上下文。例如,如果傳入數據很少(例如web-sockets),那麼您可能需要使用一個小緩衝區(即使只是一個字節)進行異步讀取 - 然後使用更大的緩衝區(可能來自池)數據可用。或者您可能想使用套接字輪詢!對於更繁忙的連接,每次連接使用兩個緩衝區並不罕見 - 一個是固定大小的讀取,另一個(可能是MemoryStream)作爲後臺緩衝區,同時檢查整個幀(可能通過多次讀取)。有時你可以合併它們(例如,SE.Redis使用讀取緩衝區作爲後臺緩衝區,如果需要調整大小,並且如果我們可以消耗一些幀但留下數據,則將數據向後複製到緩衝區中)。

沒有「高效處理」這樣的事情 - 它完全取決於上下文。對於一種使用模式有效的方法對另一種使用方式效率很低。併發連接的數量和讀取頻率是關鍵因素。

+0

有道理,謝謝你的信息。 :)另外,我不相信我有訪問與TcpListener類的套接字輪詢。 – FatalSleep

+0

@FatalSleep我不知道:我只使用Socket類。抽象增加很少,並帶走很多。 –

+0

它不像套接字那樣高效,並且缺少一些功能,但它更容易實現。如果你碰巧有一個基於套接字的教程,而不是TcpClient,但我是所有人。 – FatalSleep