Как обеспечить NetworkStream для отправки данных сразу, не закрывая Stream или TcpClient?

1

У меня очень простой фрагмент кода, который пытается отправить данные через 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. Как это может быть сделано?

  • 0
    @BradleyDotNET: Я имею в виду, что сокет будет пытаться отправить поток данных немедленно, без учета сетевых задержек.
  • 0
    Определите «немедленно». Это правда, что для меньших записей в поток алгоритм Nagle задержит передачу на короткое время (намного меньше, чем на секунду), и это правда, вы можете отключить это, если хотите. Но на практике задержка является меньшей проблемой, чем неэффективность, вызванная ее отключением. Настоятельно рекомендуется не отключать его.
Теги:
tcpclient

1 ответ

3
Лучший ответ

Установите TcpClient.NoDelay в true чтобы алгоритм Nagle не использовался.

Из документации библиотеки MSDN:

Когда NoDelay является false, TcpClient не отправляет пакет по сети, пока не собрал значительное количество исходящих данных. Из-за количества накладных расходов в сегменте TCP передача небольших объемов данных неэффективна. Однако существуют ситуации, когда вам нужно отправлять очень маленькие объемы данных или ожидать немедленных ответов от каждого отправляемого вами пакета. Ваше решение должно учитывать относительную важность эффективности сети и требований приложения.

  • 0
    Обратите внимание, что документация не совсем верна: «TcpClient не отправляет пакет по сети, пока не соберет значительный объем исходящих данных». Это задержит передачу на короткое время (~ 500 мс, в зависимости от реализации). Если по истечении этого периода объем данных все еще не является «значительным», данные будут отправлены. Nagle не вызывает длительных задержек при передаче, и, как правило, его не следует отключать, поскольку он обеспечивает важные преимущества. По крайней мере, нужно полностью понять исходный вопрос, прежде чем предлагать это решение.
  • 0
    @Peter: Википедия говорит (без какой-либо ссылки): «В общем, поскольку алгоритм Nagle является лишь защитой от неосторожных приложений, он не принесет пользы тщательно написанному приложению, которое должным образом заботится о буферизации; алгоритм не имеет ни эффекта, ни отрицательного результата. эффект на приложение. "
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню