为什么NetworkStream.读取速度如此之慢

本文关键字:如此之 速度 读取 NetworkStream 为什么 | 更新日期: 2023-09-27 18:27:41

我知道,这里已经有很多类似的问题了,但我没有找到让它更快的解决方案,或者它这么慢的原因是什么?

我们在C#中有一个应用程序,它需要通过TCP与在同一TCP流上应答的设备通信(全部以字节为单位)。消息的发送速度相当快(约20ms),但当我们使用NetworkStream.Read()方法(或类似的socket.Receive())从TCP套接字读取数据时,大约需要600ms。我通过在Read方法之前启动秒表并在Read方法之后立即停止来获得这个数字。

我还用Wireshark记录了流量,在那里我看到通信进行得很快(使用TCPNoDelay和TCPAckFrequency注册表黑客),但在那里我发现发送到设备的以下消息是在600ms之后(读取之前的答案之后)。

这些设备不能同时处理多条消息,它们还可以通过自定义的确认进行应答,这样我们的程序就知道最后一条发送的消息是正确接收和构建的。

好吧,这是我为控制台应用程序编写的一些测试代码,即使是这些代码也存在读取延迟600ms的问题。

try
{
   if (!retry)
   {
      Console.WriteLine("Please enter the IP address you want to check:");
      ip = Console.ReadLine();
      Console.WriteLine("Please enter the port where you want to check on:");
      port = Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("Connecting to {0}: {1}", ip, port);
      Console.WriteLine("Please enter the message you want to write to the specified port:");
      message = Console.ReadLine();
   }
   tcp = new TcpClient(ip, port);
   tcp.NoDelay = true;
   tcp.Client.NoDelay = true;
   Stopwatch sWrite = new Stopwatch();
   Stopwatch sRead = new Stopwatch();
   Stopwatch sDataAvailable = new Stopwatch();
   using (NetworkStream ns = tcp.GetStream())
   {
      Byte[] data = System.Text.Encoding.ASCII.GetBytes(message + "'r");
      sWrite.Start();
      ns.Write(data, 0, data.Length);
      sWrite.Stop();
      data = new byte[256];
      sRead.Start();
      Console.WriteLine("There is data on the socket: {0}", ns.DataAvailable);
      int readBytes = ns.Read(data, 0, data.Length);
      sRead.Stop();
      message = System.Text.Encoding.ASCII.GetString(data, 0, readBytes);
      Console.WriteLine(message);
   }
   Console.WriteLine("The reading speed is {0} and the writing speed is {1}", sRead.ElapsedMilliseconds, sWrite.ElapsedMilliseconds);
}
catch { }
finally
{
   tcp.Close();
}

这给出了以下结果:The reading speed is 500 and the writing speed is 0

为什么NetworkStream.读取速度如此之慢

我刚刚找到了解决慢速网络问题的方法,我想和大家分享。你永远不知道什么时候或谁可能会遇到同样的问题
今天早些时候,我来到这个网站TcpClient接收延迟超过500ms,在那里我遵循了PSH位的注册表破解(IgnorePushBitOnReceives)的解决方案,并解决了它。所以我们现在有了临时的快速通信,因为我认为我们正在工作的硬件的人,只需要设置TCP消息的Push标志。

我想你可以在那里找到答案:

NetworkStream Read Slowness

只需尝试更改缓冲区大小,它就会工作得更快。

您还应该尝试使用Microsoft网络监视器来查看问题背后的原因。