Асинхронная передача данных, или как отослать слепить буфер без копирования ? - C#

Узнай цену своей работы

Формулировка задачи:

Отсылаю данный клиенту: (TcpUnit - обертка вокруг TcpClient, Stream - NetworkStream)
public async void Send(TcpUnit unit, byte[] command, byte[] data)
  {
     byte[] size = BitConverter.GetBytes(data.Length + command.Length);
     await unit.Stream.WriteAsync(size, 0, size.Length);//размер данных
     await unit.Stream.WriteAsync(command, 0, command.Length);//команда
     await unit.Stream.WriteAsync(data, 0, data.Length);//данные  
   }
Но тогда на принимающей стороне приходит каша, что в принципе логично, ведь в стрим данные пишутся не последовательно. В идеале хотелось бы так:
public async void Send(TcpUnit unit, byte[] all)
{
   await unit.Stream.WriteAsync(all, 0, all.Length);//размер данных
}
Тогда на принимающей стороне все пучком- данные лежат одним пакетом. Но в реале чтобы создать массив all приходиться делать так:
public async void Send(TcpUnit unit,byte[] command, byte[] data)
{
  byte[] all = new byte[data.Length + command.Length + 4];//4 - размер сайза
  byte[] size = BitConverter.GetBytes(data.Length + command.Length);
  Array.Copy(size, 0, all, 0, size.Length);
  Array.Copy(command, 0, all, size.Length, command.Length);
  Array.Copy(data, 0,all, command.Length + size.Length, data.Length);
  await MyStream.WriteAsync(all, 0, all.Length);
            
}

Как избежать лишнего копирования, или как запихать данные в стрим одним куском ? Помогайте.

Поправка: данные лежат хаотично, если сделать два сенда подряд асинхронно. Хоть идей подкиньте, а ?

Решение задачи: «Асинхронная передача данных, или как отослать слепить буфер без копирования ?»

textual
Листинг программы
            int command = 0xA;
            string value = "Test";
            var buff = GetBytes( command, value );
 
            var length = BitConverter.ToInt32( buff, 0 );
            command = BitConverter.ToInt32( buff, 4 );
            value = Encoding.Default.GetString( buff, 8, length - 8 );

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 4 из 5