Алгоритм нейгла не выключаеться

Написал вот такой код для отправки больших массивов данных по TCP сокету:

public async Task SendMessage(TcpClient client, string? packetid, string message)
{
    if (client == null || !client.Connected) return;
    if (Encoding.UTF8.GetBytes(message).Length + Encoding.UTF8.GetBytes($"singlemessage¶|~{packetid}¶|~").Length > buffersize)
    {
        NetworkStream stream = client.GetStream();
        Random random = new Random();
        string startmessage;
        string dataid = $"id{random.Next(1, 999999999)}";
        if (packetid != null)   { startmessage = $"startlistening¶|~{dataid}¶|~{packetid}"; }
        else                    { startmessage = $"startlistening¶|~{dataid}¶|~nullid"; }
        await stream.WriteAsync(Encoding.UTF8.GetBytes(startmessage), 0, Encoding.UTF8.GetBytes(startmessage).Length);
        byte[] messageBytes = Encoding.UTF8.GetBytes(message);
        int chunkSize = buffersize - Encoding.UTF8.GetBytes($"appenddata¶|~{dataid}¶|~").Length;
        int bytesSent = 0;

        while (bytesSent < messageBytes.Length)
        {
            int bytesToSend = Math.Min(chunkSize, messageBytes.Length - bytesSent);
            var dataToSend = new List<byte>();
            dataToSend.AddRange(Encoding.UTF8.GetBytes($"appenddata¶|~{dataid}¶|~"));
            dataToSend.AddRange(messageBytes.Skip(bytesSent).Take(bytesToSend));
            await stream.WriteAsync(dataToSend.ToArray(), 0, dataToSend.Count);

            bytesSent += bytesToSend;
        }

        await stream.WriteAsync(Encoding.UTF8.GetBytes($"enddata¶|~{dataid}"), 0, Encoding.UTF8.GetBytes($"enddata¶|~{dataid}").Length);
    }
    else
    {
        try
        {
            NetworkStream stream = client.GetStream();
            string fullmessage;
            if (packetid != null)   { fullmessage = $"singlemessage¶|~{packetid}¶|~{message}"; }
            else                    { fullmessage = $"singlemessage¶|~nullid¶|~{message}"; }
            byte[] data = Encoding.UTF8.GetBytes(fullmessage);

            await stream.WriteAsync(data, 0, data.Length);
        }
        catch{ }
    }
}

Однако столкнулся с проблемой, что сообщения, сливаються в одно, при вызове:

await server.SendMessage(client, null, string.Concat(Enumerable.Repeat(message, 250)));

Получаю что то такое: введите сюда описание изображения

Пробовал отключить алгоритм нейгла:

private async Task ListenForConnectionsAsync()
{
    try
    {
        while (_isRunning)
        {
            var client = await _listener.AcceptTcpClientAsync();
            client.NoDelay = true;
            await HandleClientAsync(client);
        }
    }
    catch { }
}

Но это не решило мою проблему. Есть идея с тем чтоб просто засирать пустое место в буфере юзлес символами, и удалять их после получения пакета, но честно говоря эта идея мне не очень нравиться.


Ответы (0 шт):