gpt4 book ai didi

c# - C#套接字异常延迟

转载 作者:行者123 更新时间:2023-12-03 11:56:26 26 4
gpt4 key购买 nike

我正在使用C#和XNA开发一个在线多人乒乓球小游戏。

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

问题在于速度:传输速度很慢。

当我对第二台计算机执行ping操作时,它显示2 ms的延迟。
我在代码中设置了一个小计时器,它显示了大约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
真的没有任何帮助。

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

谢谢

最佳答案

您看到的延迟很可能是由于Nagle's algorithm所致,它用于在使用TCP发送大量小数据包时提高效率。本质上,TCP堆栈将小数据包收集在一起,并在传输之前将它们合并为更大的数据包。显然,这意味着在发送输出缓冲区中的等待内容之前,延迟一小段时间(最多200ms)以查看是否还有数据发送。

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

但是,请注意,如果对套接字进行大量小写操作,则可能会由于TCP头开销和每个数据包的处理而导致性能下降。在这种情况下,如果可能的话,您希望尝试将您的写操作收集在一起。

关于c# - C#套接字异常延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/422809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com