繁体   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