Почему передача файлов через сокет происходит медленнее, чем при копировании в Windows?

У меня проблема с передачей файлов по сети. Загрузка через сокет TCP/UDP выполняется медленнее, чем при собственном копировании Windows, если имеется более 1 клиентов.

У меня есть компьютер с сетью 1 Гбит / с.

Вот случаи копирования Windows.

Одна клиентская копия с сервера, максимальная скорость загрузки около 100 Мбит / с. (Оно должно быть выше 100 Мбит / с, в маршруте есть узкое место.)

Два клиента копируют с сервера, максимальная скорость загрузки составляет около 200 Мбит / с.

Три клиента копируют с сервера, максимальная скорость загрузки составляет около 300 Мбит / с.

Вот случаи сокета.

Загрузка одного клиента с сервера, максимальная скорость загрузки около 100 Мбит / с.

Два клиента загружают с сервера, максимальная скорость загрузки составляет около 100 Мбит / с.

Три клиента загружают с сервера, максимальная скорость загрузки составляет около 100 Мбит / с.

Как видите, скорость загрузки сокет-сервера не увеличивается, а число клиентов увеличивается.

Мы сделали простую программу для проверки этой проблемы. Он сталкивается с теми же проблемами. Это просто очень просто отправить и позвонить. Пожалуйста, проверьте коды.

 class Program
 {
   static List<TcpClient> sessions = new List<TcpClient>();

   static void Main(string[] args)
   {
      bool isServer = false;
      Console.WriteLine("Run as a server? (Y/N)");
      string answer = Console.ReadLine();
      if (answer.ToUpper().StartsWith("Y")) isServer = true;

      if (isServer)
      {
         TcpListener listener = new TcpListener(IPAddress.Any, 13579);
         Console.WriteLine("Listening at: " + ((IPEndPoint)listener.LocalEndpoint).ToString());
         listener.Start();
         Thread workerThread = new Thread(() => 
         {
           while (true)
           {
              lock (sessions)
              {
                 foreach (var client in sessions)
                 {
                   if (client.Available > 0)
                   {
                      byte[] buffer = new byte[client.Available];
                      int length = client.Client.Receive(buffer);
                      string filePath = Encoding.UTF8.GetString(buffer, 0, length);

                      if (File.Exists(filePath))
                      {
                         foreach (var receiver in sessions)
                            receiver.Client.SendFile(filePath, null, null, TransmitFileOptions.UseKernelApc | TransmitFileOptions.WriteBehind);
                      }
                   }
                 }
              } 
              Thread.Sleep(200);
           }

         });

         workerThread.IsBackground = true;
         workerThread.Start();

         while (true)
         {
             TcpClient client = listener.AcceptTcpClient();
             lock (sessions)
             {
                sessions.Add(client);
             }
         }
      }
      else
      {
         Console.WriteLine("Enter the server IP:");
         string ipAddress = Console.ReadLine();
         TcpClient client = new TcpClient(ipAddress, 13579);
         Console.WriteLine("Enter the file path on remote server:");
         string remoteFilePath = Console.ReadLine();
         if(remoteFilePath != "")
                   client.Client.Send(Encoding.UTF8.GetBytes(remoteFilePath));
         byte[] recvBuffer = new byte[32768];
         while(true)
         {
           try
           {
                    client.Client.Receive(recvBuffer, 32768, SocketFlags.None);
           }
           catch (SocketException e)
           {
                    Console.WriteLine("Transfer interrupted: {0}", e.Message);
                    break;
           }
         }
      }
   }
 }

Это мешает нам реализовать инструмент сокетов с лучшей производительностью. Надеюсь, ребята из stackru могут помочь нам. Спасибо заранее.

1 ответ

Конечно медленнее. Вы используете один и тот же поток для опроса всех клиентов.

Вы должны переключиться на асинхронные методы на сервере (BeginRead/EndRead)

Другие вопросы по тегам