Я получаю пакеты в моем 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);
}
}