Я пишу клиент для сервера, который обычно отправляет данные в виде строк в 500 или менее байтов. Однако данные иногда будут превышать это, и один набор данных может содержать 200 000 байт, поскольку все клиенты знают (при инициализации или значимых событиях). Однако я бы не хотел, чтобы каждый клиент работал с буфером сокетов размером 50 МБ (если это возможно).Как я должен обрабатывать неполные буферы пакетов?
Каждый набор данных ограничен символом \0
. Какую структуру я должен искать для хранения частично отправленных наборов данных?
Например, сервер отправляет ABCDEFGHIJKLMNOPQRSTUV\0WXYZ\0123!\0
. Я бы хотел обработать ABCDEFGHIJKLMNOPQRSTUV
, WXYZ
и 123!
самостоятельно. Кроме того, сервер может отправить ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890LOL123HAHATHISISREALLYLONG
без символа завершения. Я хотел бы, чтобы этот набор данных хранился где-то для последующего добавления и обработки.
Кроме того, я использую асинхронные методы сокетов (BeginSend
, EndSend
, BeginReceive
, EndReceive
), если это имеет значение.
В настоящее время я обсуждаю между List<Byte>
и StringBuilder
. Любое сравнение двух для этой ситуации было бы очень полезно.
Возможно, 'MemoryStream', а не' List '? И 'stream.Seek (0, SeekOrigin.Begin)' вместо 'RemoveRange'. –
Это тоже возможность. Я полагаю, это зависит от того, как структурирован код. Если он обрабатывает сообщение, как только встречается нулевой терминатор, то поиск 0 будет работать нормально. Однако, если он сначала считывает все ожидающие данные сокетов, а затем ищет нулевой ограничитель, поиск 0 будет потерять все после первого сообщения. Я принимал последнее. – EMP