【问题标题】:Will TcpClient.NoDelay affect already written data?TcpClient.NoDelay 会影响已经写入的数据吗?
【发布时间】:2021-04-24 23:43:36
【问题描述】:

TcpClient.NoDelay 文档状态:

获取或设置一个值,当发送或接收缓冲区未满时禁用延迟。

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

【问题讨论】:

标签: c# .net sockets tcp tcpclient


【解决方案1】:

文档对此不是很有帮助,但请考虑一下:

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

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

【讨论】:

    【解决方案2】:

    当缓冲区中有数据并且 NoDelay 设置为 true 时,将 缓冲区中的数据是否立即发送?

    没有。

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

    您可以使用NoDelay = true 后跟Send 验证几个字节。

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

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


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

    套接字选项由method 调用setsockopt 设置,即native code

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-26
      • 2017-11-11
      • 2021-09-18
      • 2017-07-03
      • 2014-12-16
      • 1970-01-01
      相关资源
      最近更新 更多