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

问题描述 投票:1回答:1

我试图在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作为错误代码。请帮忙!

c++ sockets tcp winsock
1个回答
2
投票

我在网上看到过几个参考资料,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及更高版本中可用。

© www.soinside.com 2019 - 2024. All rights reserved.