[英]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.