在许多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堆栈发送物理包。)
答案 0 :(得分:5)
FWIW我成功使用TCP_NODELAY来获取TCP_CORK样式的行为。我是这样做的:
在Windows,MacOS / X和Linux下,这对我来说很好。 (注意,在Linux下,最后的零字节send()不是必需的)
答案 1 :(得分:3)
没有等价物。您可以做的最好是先将数据收集到自己的缓冲区中,然后在准备好后将完成的缓冲区发送到套接字,让Nagle正常处理数据包。