强制TCP流发送缓冲区内容

时间:2011-07-02 16:54:32

标签: c# sockets tcp client

我正在使用Csharp tcp套接字在客户端和服务器之间发送数据。 现在问题就像我看到它或我认为的那样,tcp是一个流协议,不会推送(发送)数据,除非它们足够数量。

例如,假设我想发送一些数据,无论它只是说它的8字节长。我所看到的行为无论我等多久它都不会发送数据,除非我推动它更多地推迟到达tcp缓冲区。

所以我的问题是。如果我想通过tcp发送少量数据,我需要在末尾添加垃圾以强制套接字发送。 (我不会对此感觉良好)或者是他们可以强迫流的前段发送的替代方式。

提前谢谢。我仍在学习tcp,所以请原谅无知。

2 个答案:

答案 0 :(得分:5)

除非您是TCP / IP专家并了解其全部后果,否则请勿设置NoDelay。如果你还没有读过史蒂文斯,请不要考虑它。

这是一个示例问题:如果建立套接字连接并在其上发送8个字节,是否立即发送8个字节,或者Nagle算法是否等待发送更多数据?答案是“8个字节立即被发送” - 但是在你完全理解为什么作为答案之前,不要考虑搞乱Nagle。

这是另一个问题:在标准命令/响应协议中,每个数据包应用了多少Nagle延迟?答案是:没有。同样,您应该研究为什么 Nagle会导致 no 延迟。

如果您没有看到250毫秒发送的数据(Nagle在最糟糕的情况下造成的最大延迟),那么还有其他问题。

答案 1 :(得分:2)

您可以设置NoDelay属性(我认为这是禁用Nagle的内容)。