У меня очень простой фрагмент кода, который пытается отправить данные через TcpClient
и связанный с ним NetworkStream
.
var client = new TcpClient("xxx.xxx.xxx.xxx", 1234);
NetworkStream stream = client.GetStream();
byte[] buffer = Encoding.ASCII.GetBytes(str);
stream.Write(buffer, 0, buffer.Length);
Я обнаружил, что обычно данные не будут отправляться сразу после stream.Write()
. Если я добавлю client.Close()
или stream.Close()
тогда данные будут отправлены. Однако, в моем случае, я пытаюсь дождаться, когда сервер отправит некоторое сообщение ACK, поэтому я хочу повторно использовать оригинальный NetworkStream
не закрывая TcpClient
или NetworkStream
. Как это может быть сделано?
Установите TcpClient.NoDelay
в true
чтобы алгоритм Nagle не использовался.
Из документации библиотеки MSDN:
Когда NoDelay является
false
, TcpClient не отправляет пакет по сети, пока не собрал значительное количество исходящих данных. Из-за количества накладных расходов в сегменте TCP передача небольших объемов данных неэффективна. Однако существуют ситуации, когда вам нужно отправлять очень маленькие объемы данных или ожидать немедленных ответов от каждого отправляемого вами пакета. Ваше решение должно учитывать относительную важность эффективности сети и требований приложения.