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

时间:2019-03-07 00:06:45

标签: c++ sockets tcp winsock

我试图在Windows计算机上复制实时应用程序,以便能够调试并使更改变得更容易,但是我遇到了“延迟确认”问题。我已经禁用了nagle,并确认它可以提高速度。当发送大量小数据包时,窗口不会立即进行确认并将其延迟200毫秒。在做更多的研究时,我遇到了this。更改注册表值的问题是,它将影响整个系统,而不仅仅是我正在使用的应用程序。无论如何,使用TCP_QUICKACK从Linux禁用setsockopt之类的窗口系统上的延迟ACK?我尝试进行硬编码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 作为错误代码。请帮忙!

1 个答案:

答案 0 :(得分:2)

我在线上看到了几篇参考文献,尽管没有记录或未得到官方确认,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);

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