C++ 在 Windows 上禁用延迟确认

Pyr*_*mer 3 c++ sockets tcp winsock

我正在尝试在 Windows 计算机上复制实时应用程序,以便能够更轻松地进行调试和更改,但是我遇到了延迟确认的问题。我已经禁用了 nagle 并确认它稍微提高了速度。当发送大量小数据包时,window 不会立即确认并延迟 200 毫秒。对此进行更多研究,我遇到了这个。更改注册表值的问题在于,它会影响整个系统,而不仅仅是我正在使用的应用程序。无论如何要禁用窗口系统上的延迟 ACK,例如TCP_QUICKACK从 linux 使用setsockopt?我尝试硬编码 12,但从WSAGetLastError得到了WSAEINVAL

我在 github 上看到了一些提到要使用的开发人员,SIO_TCP_SET_ACK_FREQUENCY但我没有看到有关如何实际使用它的任何示例。

所以我尝试在下面做

#define SIO_TCP_SET_ACK_FREQUENCY _WSAIOW(IOC_VENDOR,23) 
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, 0, 0, info, sizeof(info), &bytes, 0, 0);
Run Code Online (Sandbox Code Playgroud)

我得到了WSAEFAULT作为错误代码。请帮忙!

Rem*_*eau 5

我见过几次提到网上说TCP_QUICKACK 可能实际上是由通过Winsock的支持setsockopt()(选择12),即使它没有记录,或任何地方官方证实。

但是,关于您的实际问题,您的使用SIO_TCP_SET_ACK_FREQUENCY失败了,因为您没有提供任何输入缓冲区WSAIoctl()来设置实际频率值。尝试这样的事情:

int freq = 1; // can be 1..255, default is 2
result = WSAIoctl(sock, SIO_TCP_SET_ACK_FREQUENCY, &freq, sizeof(freq), NULL, 0, &bytes, NULL, NULL);
Run Code Online (Sandbox Code Playgroud)

请注意,这SIO_TCP_SET_ACK_FREQUENCY在 Windows 7 / Server 2008 R2 及更高版本中可用。