簡體   English   中英

C#服務器-TCP / IP套接字效率

[英]C# Server - TCP/IP Socket Efficiency

大家好!

我正在為開放源代碼的游戲開發開放源代碼服務器-該游戲使用TCP / IP套接字(而不是UDP,doh ...)運行。因此,作為基於連接的協議,我不得不使用此協議。

我當前的程序結構(歸納):

核心線程

  • 接收新的連接並創建一個新的客戶端對象。

客戶對象

  • IOloop(在其自己的線程上運行)

    • 從套接字獲取數據,處理數據包。 (一次一包)
    • 發送從其他線程緩沖的數據(一次一個數據包)

當它是自己的線程時,客戶端將立即發送數據(無延遲)。


我注意到該程序存在一個巨大缺陷,主要是它發送數據的速度非常慢。 因為我一個包一個包地同步發送數據。 (Socket.Send(字節[]緩沖區))

我想幾乎立即無延遲地發送數據-異步。

每當嘗試發送數據包時,我都嘗試創建一個新線程(因此每個數據包都在其自己的托管線程上發送),但這真是一團糟。

我當前的系統使用禁用nagle算法的同步發送-但這有瓶頸的缺點-發送一個數據包,發送操作塊直到TCP確認,然后再發送下一個...我可以每100毫秒輕松發出10個數據包,如果數據包需要400毫秒才能發送,這會備份並中斷。 當然,在我的本地主機上,我不會遇到此問題。


所以,我的問題是:發送多個小數據包的最佳方法是什么? 我正在考慮將要在每個IO線程循環結束時發送的數據合並到一個大字節緩沖區中,以減少來回延遲-但是這里明顯的問題是,這破壞了nagle算法的避免性,我本來希望這會阻止延遲。

同步發送如何工作? 是否會阻塞,直到我相信接收者已正確確認數據為止? 有沒有一種方法可以不用等待確認就執行此操作? 我確實了解到數據包必須全部按順序正確排列(按照協議規范)。

我已經做了一些研究,現在正在使用當前系統:

使用AsyncCallbacks,無需線程即可進行異步發送/接收操作。

所以我讓服務器開始讀取操作,然后回調直到完成,當接收到數據包時,將對其進行處理,然后將開始新的讀取操作...

這種方法大大減少了系統開銷-線程池,內存等。

我使用了以下幾種方法,並根據自己的喜好進行了定制: https ://msdn.microsoft.com/zh-cn/library/bew39x2a( v= vs.110) .aspx

非常有效,強烈建議使用此方法。 對於任何TCP / IP網絡應用程序而言,低延遲都是非常重要的,異步回調是實現此目標的最佳方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM