我有一个非常简单的代码段,它尝试通过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 :(得分:3)
将TcpClient.NoDelay
设置为true
,以便Nagle's algorithm不被使用。
从MSDN Library文档:
当NoDelay为
false
时,TcpClient在收集大量传出数据之前不会通过网络发送数据包。由于TCP段中的开销量很大,因此发送少量数据效率很低。但是,确实存在需要发送非常少量数据或期望从您发送的每个数据包立即响应的情况。您的决定应权衡网络效率与应用要求的相对重要性。