Асинхронная передача данных, или как отослать слепить буфер без копирования ? - C#
Формулировка задачи:
Отсылаю данный клиенту: (TcpUnit - обертка вокруг TcpClient, Stream - NetworkStream)
Но тогда на принимающей стороне приходит каша, что в принципе логично, ведь в стрим данные пишутся не последовательно.
В идеале хотелось бы так:
Тогда на принимающей стороне все пучком- данные лежат одним пакетом.
Но в реале чтобы создать массив all приходиться делать так:
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);//размер данных }
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 );
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д