В многопоточном tcp клиент - серверном приложении проскакивают битые сообщения

Рейтинг: 0Ответов: 1Опубликовано: 22.04.2023

При многопоточной работе клиента и сервера через TpcClient и и записи данных через NetworkStream при работе в 100 потоком через ~ минут 30 или 1000 потоков и минут 10 после куче валидных сообщений проскакивает битое сообщение склееное из нескольких и между ними китайские иероглифы. На большом количестве потоков проверяю чтобы найти баги, этот баг не могу приложить ума как исправить, может есть какие то практики для работы TCP которые это решают эту проблему? Отправляю пакеты так:

byte[] data = Encoding.Unicode.GetBytes(sendData);
stream.Write(data, 0, data.Length);

Получаю так:

byte[] data = new byte[64];
int bytes;
do
{
    bytes = stream.Read(data, 0, data.Length);
    if (bytes != 0)
    {
        string receivingData = Encoding.Unicode.GetString(data, 0, bytes);
        BufferReceiver.Append(receivingData);
    }
}
while (stream.DataAvailable);
if (bytes == 0) break;

Ответы

▲ 0Принят

Как указали в комментарии, stream.Read может вернуть ровное или меньшее количество байт, чем запрашиваемый размер буфера.

Решить можно как-то так (буфер побольше можно сделать):

Span<byte> buffer = stackalloc byte[512];
int bytesReceived = 0;
MemoryStream ms = new(buffer.Length);
while ((bytesReceived = stream.Read(buffer)) > 0)
{
    ms.Write(buffer[..bytesReceived]);
}
string result = Encoding.UTF8.GetString(ms.GetBuffer().AsSpan()[..ms.Length]);

Очень рекомендую вместо Unicode использовать UTF-8 для передачи данных.