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

Typ*_*eIA 4 sockets winapi winsock nagle

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

TCP_CORK(自Linux 2.2起)

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

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

Jer*_*ner 7

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

  1. 取消设置套接字上的TCP_NODELAY标志
  2. 调用send()零次或多次以将传出数据添加到Nagle队列中
  3. 在套接字上设置TCP_NODELAY标志
  4. 调用send()并将number-of-bytes参数设置为零,以强制立即发送Nagle排队的数据

在Windows,MacOS/X和Linux下,这对我来说很好.(注意,在Linux下,最后的零字节send()不是必需的)