当前位置:  开发笔记 > 编程语言 > 正文

C#套接字异常延迟

如何解决《C#套接字异常延迟》经验,为你挑选了1个好方法。

我正在使用C#和XNA进行一个小型在线多人乒乓球比赛.

我使用套接字在我的个人LAN上的两台计算机之间传输数据.它工作正常.

问题在于速度:转移很慢.

当我ping第二台计算机时,它显示2毫秒的延迟.我在我的代码中设置了一个小计时器,它显示了大约200毫秒的延迟.即使服务器和客户端在同一台计算机上(使用127.0.0.1),延迟仍然大约为15毫秒.我认为这很慢.

以下是我的代码的一些片段:

server = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
server.Bind(new IPEndPoint(IPAddress.Any, port));
server.Listen(1);
// Begin Accept
server.BeginAccept(new AsyncCallback(ClientAccepted), null);

在ClientAccepted中,我设置了一个NetworkStream,一个StreamReader和一个StreamWriter.这是我想要更新玩家位置时发送消息的方式:

string message = "P" + "\n" + player.Position + "\n";
byte[] data = Encoding.ASCII.GetBytes(message);
ns.BeginWrite(data, 0, data.Length, new AsyncCallback(EndUpdate), null);

EndUpdate唯一做的就是调用EndWrite.这是我收到数据的方式:

message = sr.ReadLine();

它不会阻止我的游戏,因为它是在第二个线程上.

这些是我尝试的东西: - 使用IP而不是TCP - 使用二进制消息而不是文本 - 使用IPv6而不是IPv4没有任何帮助.

关于如何改善延迟的任何想法?

谢谢



1> Mike Scott..:

您看到的延迟很可能是由于Nagle的算法,该算法用于在使用TCP发送大量小数据包时提高效率.本质上,TCP堆栈将小数据包收集在一起,并在传输之前将它们合并为更大的数据包.这显然意味着延迟一个小间隔 - 最多200ms - 在发送在输出缓冲区中等待的内容之前查看是否有更多数据被发送.

因此,请尝试通过在套接字上将NoDelay属性设置为true来关闭Nagle .

但是,请注意,如果对插槽执行大量小写操作,则可能会因TCP标头开销和每个数据包的处理而丢失性能.在这种情况下,如果可能的话,您希望尝试将您的写入一起收集到批处理中.

推荐阅读
谢谢巷议
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有