我试图在Windows计算机上复制一个实时应用程序,以便能够调试和更改更容易,但我遇到了Delayed Ack的问题。我已经禁用了nagle并确认它提高了一点速度。当发送大量小数据包时,窗口不会立即确认并将其延迟200 ms。关于它的更多研究,我遇到了this。更改注册表值的问题在于,它将影响整个系统,而不仅仅是我正在使用的应用程序。无论如何使用TCP_QUICKACK
禁用来自linux的setsockopt
等窗口系统上的延迟ACK?我试过硬编码12,但从WSAGetLastError得到了WSAEINVAL。
我在github上看到了一些关于使用SIO_TCP_SET_ACK_FREQUENCY
的dev,但我没有看到任何关于如何实际使用它的例子。
所以我试着在下面做
#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
实际上可以通过setsockopt()
(opt 12)得到Winsock的支持,即使它没有记录,也没有在任何地方正式确认。
但是,关于你的实际问题,你使用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及更高版本中可用。