[英]C# Server - TCP/IP Socket Efficiency
大家好!
我正在為開放源代碼的游戲開發開放源代碼服務器-該游戲使用TCP / IP套接字(而不是UDP,doh ...)運行。因此,作為基於連接的協議,我不得不使用此協議。
我當前的程序結構(歸納):
核心線程
- 接收新的連接並創建一個新的客戶端對象。
客戶對象
IOloop(在其自己的線程上運行)
- 從套接字獲取數據,處理數據包。 (一次一包)
- 發送從其他線程緩沖的數據(一次一個數據包)
當它是自己的線程時,客戶端將立即發送數據(無延遲)。
我注意到該程序存在一個巨大缺陷,主要是它發送數據的速度非常慢。 因為我一個包一個包地同步發送數據。 (Socket.Send(字節[]緩沖區))
我想幾乎立即無延遲地發送數據-異步。
每當嘗試發送數據包時,我都嘗試創建一個新線程(因此每個數據包都在其自己的托管線程上發送),但這真是一團糟。
我當前的系統使用禁用nagle算法的同步發送-但這有瓶頸的缺點-發送一個數據包,發送操作塊直到TCP確認,然后再發送下一個...我可以每100毫秒輕松發出10個數據包,如果數據包需要400毫秒才能發送,這會備份並中斷。 當然,在我的本地主機上,我不會遇到此問題。
所以,我的問題是:發送多個小數據包的最佳方法是什么? 我正在考慮將要在每個IO線程循環結束時發送的數據合並到一個大字節緩沖區中,以減少來回延遲-但是這里明顯的問題是,這破壞了nagle算法的避免性,我本來希望這會阻止延遲。
同步發送如何工作? 是否會阻塞,直到我相信接收者已正確確認數據為止? 有沒有一種方法可以不用等待確認就執行此操作? 我確實了解到數據包必須全部按順序正確排列(按照協議規范)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.