如何确保NetworkStream在不关闭Stream或TcpClient的情况下立即发送数据?

时间:2014-12-10 22:47:01

标签: c# tcpclient

我有一个非常简单的代码段,它尝试通过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而不关闭TcpClientNetworkStream 。怎么办呢?

1 个答案:

答案 0 :(得分:3)

TcpClient.NoDelay设置为true,以便Nagle's algorithm不被使用。

从MSDN Library文档:

  

当NoDelay为false时,TcpClient在收集大量传出数据之前不会通过网络发送数据包。由于TCP段中的开销量很大,因此发送少量数据效率很低。但是,确实存在需要发送非常少量数据或期望从您发送的每个数据包立即响应的情况。您的决定应权衡网络效率与应用要求的相对重要性。