TcpClient.NoDelay 会影响已经写入的数据吗?

Will TcpClient.NoDelay affect already written data?

TcpClient.NoDelay 文档状态:

Gets or sets a value that disables a delay when send or receive buffers are not full.

然而,尚不清楚这是否仅适用于 设置为 true 之后写入的数据,或者是否适用于已写入且正在等待的数据,因为出色地。 IE。 当缓冲区中有数据时,NoDelay设置为true时,缓冲区中的数据会立即发送吗?

文档对此没有太大帮助,但考虑一下:

如果当您将 NoDelay 设置为 true 时缓冲区中仍有数据,那么它应该会影响等待字节,因为如果您写入更多数据,它肯定会影响它。如果不是所有字节(在设置 NoDelaytrue 之前和之后写入)都被平等对待,那应该如何工作?

你能 100% 确定吗?并非没有询问 TcpClient 的作者或检查其代码。

When there's data in the buffer and NoDelay is then set to true, will the data in the buffer be sent immediately?

没有

它会在下一个 Send 使用有效数据进行评估。

您可以使用 NoDelay = true 后跟带有几个字节的 Send 进行验证。

或者设置 NoDelay = true 之后不调用 Send,你应该看不到任何变化。

我使用 Wireshark 进行了验证,但请使用您喜欢的任何数据包检测工具。


TcpClient 只是 Socket 的薄包装,因此您可以以相同的方式使用 Socket.NoDelay

套接字选项由此 method calling setsockopt which is native code:

设置
errorCode = UnsafeNclNativeMethods.OSSOCK.setsockopt(
    m_Handle,
    optionLevel,
    optionName,
    ref optionValue,
    sizeof(int));

在这种情况下实际设置的选项是 TCP_NODELAY