Roman
А на том конце мы знать не знаем вообще какого оно размера
Roman
Для нас это просто одна сплошная ридонли последовательность из байтиков
Vasily
Это понятно
Roman
И по мере прочтения оной наш пайп понимает какие из сегментов были прочитаны и реюзает их повторно
Roman
Чтобы не аллоцировать много
Vasily
Ну смотри
Vasily
Получил я с помощью ReadAsync
Vasily
ReadResult
Vasily
Допустим,это кусок сообщения
Vasily
Без длины
Roman
Берём сколько байт из него
Roman
Чтобы узать оттуда длину сообщения всего
Vasily
Непонятно
Vasily
Нам надо длину хранить
Vasily
Тут классическая свертка
Roman
Ну у тебя, скажем длина всего сообщения, которое в сокет приедет - в первых 10 байтах лежит
Roman
Вот эти 10 байт и берём
Roman
Чтобы узать какая она там вообще будет
Vasily
Но фишка в том, что, когда я прочитаю следующий ReadAsync()
Roman
не не
Vasily
Там может быть часть сообщения плюс начало нового
Roman
reader.AdvanceTo
Roman
Ты должен райтеру сказать сколько ты прочитал
Roman
скажем, 10 байт
Roman
из которых ты узнал, что длина месседжа 100500 байт
Vasily
Т.е. сколько реально взял, как я понимаю
Roman
ну и дальше ты читаешь чанками по, скажем, 512 байт, копируя их в свой локальный буфер под месседж
Roman
и делаешь reader.AdvanceTo каждому прочитанному чанку
Vasily
Дык вот
Vasily
В твоем примере аллокации все равно есть
Vasily
А вот как бы прямо из ридера взять сколько надо, пока неясно
Roman
Хмм
Vasily
Скорее так - читаем 4 байта, определяем длину
Vasily
Дальше на каждом чтении делаем advanceTo в зависимости от того, сколько осталось
Vasily
Как только совпали с длиной, вернули
Vasily
Но тоже пока не очень прозрачно, надо почитать что-нить умное на тему
Ayrat
да ёмаё, чем тебе ArrayPool-то не нравится?
Vasily
Vasily
НО
Roman
Vasily
Копировать руками
Vasily
В тот же MemoryStream я просто последовательно пишу
Ayrat
я бы считывал фреймы в ArrayPool и набивал бы на стеке массив референсов на эти массивы, потом как встречу разделитель сообщения, склеивал бы массивы в месаджи, освобождал кусочки массивов и начинал заново
Ayrat
Vasily
Да нету разделителя сообщения
Vasily
Точнее разделитель - его длина
Ayrat
один
Roman
Смотри, читаешь из сокета данные
Vasily
длина-блоб, длина-блоб
Ayrat
под разделителем подразумевается любое что-то что позволит нам сказать что здесь конец месаджа, а здесь начало
Roman
При аццепте 4 байта свои с длиной - тем самым узнаёшь длину
Roman
А дальше в пайп пишешь до тех пор, пока не запишешь байтов столько, какая длина у сообщения
Vasily
Roman
Потом делаешь PipeWriter.FlushAsync()
Roman
И всё что окажется в ридере - как раз твоё собщение
Roman
Потом снова читаешь 4 байта...
Roman
Ну и по кругу
Hog
Мне кажется, что Василий слишком много думает!
Roman
В итоге когда ты в ридере находишься - у тебя если ридонли сиквенс как раз из твоего сообщения
Vasily
Я примерно так и сделал, но без пайпов
Roman
Roman
Будешь модный стильный молодежный
Vasily
Куда уж нам....
Vasily
За молодыми не угонишься
Vasily
Найдут себе трубу
Roman
Есть куда)
Vasily
И начинают в нее пихать
Hog
дались тебе эти аллокации? у тебя из-за ГЦ проблемы какие-то?
Vasily
Лучше б с девушками знакомились, чесслово
Vasily
Vasily
Но на мобилке может быть критично
Roman
Hog
Roman