提高C#套接字性能

时间:2012-09-05 19:18:47

标签: c# performance sockets asyncsocket

我们有一个用C#编写的TCP异步套接字游戏服务器,用于许多并发连接。除了下面的问题,其他一切都很好:

  1. 一些用户频繁断开连接(不要小心)
  2. 缓慢连接的用户性能下降
  3. 面临此问题的大多数用户使用GSM连接(基于CDMA的便携式USB加密狗),并且信号强度通常很差。所以基本上他们的带宽相当差。也许每秒不到1KB。

    我的问题:即使是较慢的连接,我们还能做些什么来使连接更稳定并提高性能?

    我在考虑客户端和服务器端的动态TCP缓冲区,但不确定由于动态地为我的方向的每个连接执行此操作的开销导致的性能下降甚至是正确的。

    最大数据包大小小于1 KB。

    服务器和客户端上的当前TCP缓冲区大小为16KB

    关于如何在C#中为不良或慢速连接编写稳定的anync套接字代码的任何指针或参考都将是一个很大的帮助。提前谢谢。

1 个答案:

答案 0 :(得分:2)

“表现”是一个非常相对的术语。您的主要关注点似乎是数据传输速率。不幸的是,鉴于低带宽连接,你无法做很多事情 - 数据压缩可能会有所帮助,但实际效果取决于你的数据,并且总是在传输速率提高与压缩/解压缩延迟之间进行权衡。任何类型的互动游戏都需要考虑延迟。

正如@Pierre在评论中建议的那样,您可能会考虑使用UDP进行传输,但这只有在您能够容忍数据包丢失和重新排序的情况下才有效,并且这又取决于数据以及您使用它做什么。

我建议调查的另一种方法是提供两种不同的服务质量模式。良好链接上的客户端可以使用完整功能(例如,全分辨率游戏图像),而低带宽客户端将获得减少的选项(例如,尺寸小得多的低质量图像)。您可以在客户端连接/握手上测量初始往返时间以选择模式。

希望这有点帮助。