C # Как обрабатывать большие байтовые массивы? - PullRequest
0 голосов
/ 07 сентября 2018

Я получаю пакеты в моем TCP-клиенте, и вот как это работает: Сервер отправляет пакет, где первые два байта являются информацией о размере пакета. Пример: 0C 00 = длина 12 байтов. Но есть проблема (случается много), сервер отправляет много «пакетов» в один и тот же буфер, а иногда в буфере отсутствуют байты, которые поступят в следующий буфер. Что у меня сейчас: Простой TCP-сокет с Send / Recv. Список для обработки байтов, куда я добавляю байты с помощью .AddRange. PostProcess после «обрезки» массивов.

Это работает, но иногда все не так (клиент выглядит как игнорирование пакетов) Извините за мой плохой английский, и вот мой код:

bufferList = new List<byte>();
private void WaitData(IAsyncResult ar)
    {

        try
        {
            Int32 size = socket.EndReceive(ar);
            if (size > 0)
            {
                Array.Resize(ref buffer, size);
                bufferList.AddRange(buffer);
                dataProcessor();

            }
        }
        catch (Exception ex)
        {
            Functions.logMessage(logger, "Erro no wait data " + ex.Message, 1);
        }
        finally
        {
            buffer = new byte[100000];
            socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, WaitData, null);
        }

    }
 public void dataProcessor() //byte[] data
    {
            while (bufferList.Count > 0)
            {
                int size = (Int32)(BitConverter.ToInt16(bufferList.Take(2).ToArray(), 0));
                postProcess(bufferList.Take(size).ToArray());
                bufferList.RemoveRange(0, size);
            }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...