C++ 在 Windows 上禁用延迟确认
C++ Disable Delayed Ack on Windows
我正在尝试在 windows 计算机上复制实时应用程序以便能够更轻松地进行调试和更改,但我 运行 遇到了延迟确认问题。我已经禁用了 nagle 并确认它稍微提高了速度。当发送大量小数据包时,window 不会立即确认并延迟 200 毫秒。对此进行了更多研究,我遇到了 this。更改注册表值的问题在于,它会影响整个系统,而不仅仅是我正在使用的应用程序。无论如何,是否可以使用 setsockopt
禁用 window 系统上的延迟 ACK,例如 linux 中的 TCP_QUICKACK
?我尝试硬编码 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);
我得到了 WSAEFAULT 作为错误代码。请帮忙!
我在网上看到了一些参考资料,其中 TCP_QUICKACK
可能 实际上是由 Winsock 通过 setsockopt()
(opt 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);
请注意 SIO_TCP_SET_ACK_FREQUENCY
在 Windows 7 / Server 2008 R2 及更高版本中可用。
我正在尝试在 windows 计算机上复制实时应用程序以便能够更轻松地进行调试和更改,但我 运行 遇到了延迟确认问题。我已经禁用了 nagle 并确认它稍微提高了速度。当发送大量小数据包时,window 不会立即确认并延迟 200 毫秒。对此进行了更多研究,我遇到了 this。更改注册表值的问题在于,它会影响整个系统,而不仅仅是我正在使用的应用程序。无论如何,是否可以使用 setsockopt
禁用 window 系统上的延迟 ACK,例如 linux 中的 TCP_QUICKACK
?我尝试硬编码 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);
我得到了 WSAEFAULT 作为错误代码。请帮忙!
我在网上看到了一些参考资料,其中 TCP_QUICKACK
可能 实际上是由 Winsock 通过 setsockopt()
(opt 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);
请注意 SIO_TCP_SET_ACK_FREQUENCY
在 Windows 7 / Server 2008 R2 及更高版本中可用。