Алгоритм нейгла не выключаеться
Написал вот такой код для отправки больших массивов данных по 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 { }
}
Но это не решило мою проблему. Есть идея с тем чтоб просто засирать пустое место в буфере юзлес символами, и удалять их после получения пакета, но честно говоря эта идея мне не очень нравиться.
