2012-03-23 159 views
2

我已經想通了,默認ReceiveBufferSize(8192)不爲我工作 - 我失去了包 Sockets: sometimes (rarely) packets are lost during receiving如何知道ReceiveBufferSize的設置?

但是MSDN有警告有關緩衝區大小增加:

http://msdn.microsoft.com/ru-ru/library/system.net.sockets.socket.receivebuffersize.aspx 較大的緩衝區大小可能減少空白確認的數量(沒有數據部分的TCP數據包),但也可能延遲對連接困難的識別。請考慮增加緩衝區的大小,如果您正在傳輸大文件,或者您使用的是高帶寬,高延遲連接(如衛星寬帶提供商。)

我知道,我需要得到每秒〜2000包和每個數據報包含約50-100個字節的數據。我正在使用低延遲連接(LAN中的所有內容)。我正在接收來自udp組播的股票交易數據,所以有時候我的明顯跳過跳躍(雷曼兄弟破產等),但我們假設我不會每秒收到超過20 000個數據包。

如何計算ReceiveBufferSize,將適合我的需要?

我絕對不同意失去數據包,但我不會失去性能比較或可靠性或其他任何東西爲好。

+0

該言論是關於TCP。如果你使用TCP,那麼你首先不會有這個問題。 – 2012-03-23 12:41:20

+0

@HansPassant但如何選擇ReceiveBufferSize?我可以將它設置爲100 MB並且不關心它嗎? – javapowered 2012-03-23 13:25:11

+0

一旦我在接收組播數據(〜4000包/秒)時遇到同樣的問題。我將ReceiveBufferSize設置爲256K,問題消失。 (爲什麼256K?只是試驗&錯誤;)) – 2012-03-23 13:35:30

回答

4

沒有ideal figure一個可以根據您提供的信息給你ReceiveBufferSize。
除了你​​,這取決於rate at which you process messages以及是否可以繼續這樣做,當你正在使用的郵件轟炸。

正如在你的評論中提到的問題,你應該簡介你在壓力條件下的應用程序,以發現最適合你的價值all the time

或者,你可以開始與ReceiveBufferSize的默認值,並增加它當你穿越,你想到時的情況正常化再次失去數據包將其擊落的閾值。這種方法是很多工作。

編輯:

平均來說,你會更快地處理數據,您將收到它。但是,有將是你可能無法process data at all情況下(例如,您可能需要寫入數據庫同步或連續收到每100個消息)。在這種情況下,你必須確保你的緩衝區能夠處理來自於數據傳輸的數據,因爲在最壞的情況下,你可以每秒接收高達20k個數據包,每個大小爲100字節,如果你設置緩衝區大小爲說2 MB(20k * 100字節),你應該能夠從遠端來第二個without processing any data

同樣,如果最長你希望你的線程去沒有從緩衝區中讀取的是x秒,那麼你緩衝區大小應該是x * 2 MB + (expected size of buffer at such a time)

希望這有助於。

+0

那麼問題是如何設置太大ReceiveBufferSize?也許我可以將它設置爲例如100 MB並忘記它,爲什麼不呢? – javapowered 2012-03-23 21:24:12

+0

我們需要看看msdn的含義是什麼時候它說延遲對連接困難的認識......我得到你說的...... – user1055604 2012-03-24 05:25:21

+0

@javapowered然後如果它需要重新發送它,它會發送另一個100 MB也許?而不是64kB – 2016-10-25 20:43:53