在Winsock中是否有相当于TCP_CORK的东西?

时间:2014-03-01 16:44:55

标签: sockets winapi winsock nagle

在许多UNIX TCP实现中,提供了套接字选项TCP_CORK,允许调用者绕过Nagle's algorithm并明确指定何时发送物理数据包。 Windows(Winsock)中是否有相同的功能?

  

TCP_CORK (自Linux 2.2开始)

     
    

如果设置,请不要发送部分帧。再次清除该选项时,将发送所有排队的部分帧。这对于在调用sendfile(2)之前预先添加标头或用于吞吐量优化非常有用。正如目前实施的那样,TCP_CORK的输出时间上限为200毫秒。如果达到此上限,则自动发送排队的数据。自Linux 2.5.71起,此选项只能与TCP_NODELAY结合使用。此选项不应用于可移植的代码中。

  

(我知道TCP_NODELAY,但这不是我需要的;我仍然希望在发送缓冲区中累积多次写入,然后在我准备好它时触发TCP堆栈发送物理包。)

2 个答案:

答案 0 :(得分:5)

FWIW我成功使用TCP_NODELAY来获取TCP_CORK样式的行为。我是这样做的:

  1. 取消设置套接字上的TCP_NODELAY标志
  2. 调用send()零次或多次,将您的传出数据添加到Nagle队列
  3. 在套接字上设置TCP_NODELAY标志
  4. 调用send()并将number-of-bytes参数设置为零,以强制立即发送Nagle排队的数据
  5. 在Windows,MacOS / X和Linux下,这对我来说很好。 (注意,在Linux下,最后的零字节send()不是必需的)

答案 1 :(得分:3)

没有等价物。您可以做的最好是先将数据收集到自己的缓冲区中,然后在准备好后将完成的缓冲区发送到套接字,让Nagle正常处理数据包。